- Install some prerequisitives: sudo apt-get install build-essential linux-headers-`uname -r` xinetd
- Download the VMware Server Linux client package, which is a zip that contains the following components components:
- Linux VMware Server Console (.tar and .rpm)
- Perl scripting API for Linux (.tar)
- Programming API (.tar) - Unzip the downloaded file.
- Extract the file VMware-server-console-1.0.4-56528.tar.gz.
- Enter the directory it was extracted into and run sudo ./vmware-install.pl
- The installer will ask some questions. Choose the default answer on all of them.
- Running vmware-server-console will fail with the following error messages:
/usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2) /usr/lib/vmware-server-console/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2) /usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6) /usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2) /usr/lib/vmware-server-console/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2) /usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6) /usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2) /usr/lib/vmware-server-console/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2) /usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
- Create the following links:
sudo ln -sf /lib/libgcc_s.so.1 /usr/lib/vmware-server-console/lib/libgcc_s.so.1/libgcc_s.so.1 sudo ln -sf /usr/lib/libpng12.so.0 /usr/lib/vmware-server-console/lib/libpng12.so.0/libpng12.so.0
Wednesday, May 21, 2008
Installing VMware Server Console in Hardy Heron 8.04
Monday, May 5, 2008
Installing, configuring and using ODBC on ubuntu
- First of all, unixodbc comes installed on ubuntu. Otherwise you can install the package called unixodbc.
- I downloaded and installed the ODBC connector from the MySQL website. I downloaded the rpm package, converted it to a deb with alien and installed it with dpkg.
- I also found and installed these packages in the ubuntu repositories: mysql-connector-odbc and libmyodbc. There is probably some redundancy in this step and the previous one, but at least I didn't have any conflict issues and everything worked in the end.
-
Now, unixodbc relies on two files: /etc/odbcinst.ini and ~/.odbc.ini. The first one holds a registry with ODBC drivers for different database systems. The installer for the MySQL driver (the one from the MySQL website) registers the driver with this file, so you don't need to do that manually. The file should look like this:
Make sure the location of the drivers is the correct one.
[MySQL] DRIVER = /usr/lib/libmyodbc3.so SETUP = /usr/lib/libmyodbc3S.so UsageCount = 1
-
The .odbc.ini is used for declaring datasources. Actually this file declares datasources on a per-user basis. Global datasources can be configured in the file /etc/odbc.ini.
An entry on these files should look like this:
Needless to say that the DRIVER name should must the name of the driver, as it was declared on /etc/odbcinst.ini.
[test] DRIVER = MySQL SERVER = localhost DATABASE = mysql USER =root PASSWORD = PORT = 3306 SOCKET = /var/run/mysqld/mysqld.sock
-
As you can see I also had to explicitly define the mysql socket. This was because the location of the mysql socket in ubuntu is different than in other linux systems. By default, unixodbc uses the location /tmp/mysql.sock, so you can either explicitly specify the socket location as above, or just create a link:
sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
-
Now you can test the connection using
isql -v testYou should get a message like this:followed by an SQL prompt.
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+
-
Finally this is some java code that uses this datasource:
// There are two ways we can address a datasource: // either with the DNS of a correctly configured ODBC datasource, // or by providing all the database information. Connection conn = java.sql.DriverManager.getConnection( //"jdbc:odbc:;DRIVER={MySQL};SERVER=localhost;DATABASE=mysql;", "jdbc:odbc:test", "root", "");
Monday, April 28, 2008
Changing the looks of the input boxes and button on Firefox
Thursday, April 24, 2008
Installing MS Word 2003 on ubuntu using WINE
Although OpenOffice is a fairly decent suite, there are still some compatibility issues between OO and MSOffice. In my experience these have to do with formatting, which just gets messed up if you open a Word document on OO and save it as a .doc. I read somewhere that these problems can probably be overcome if you install some fonts on linux, but I didn't try that.
Instead, I thought I should finally give WINE a try so I could stop dual-booting. I found a very helpful guide on Sorcerer's tech. I am using Feisty Fawn 7.10, and I only installed and tested Word. At the time of writing this, the newest version on the ubuntu repositories was 0.9.46. When I tried it out with this version, I got an error message as soon as Word launched, saying something like this: "Microsoft Word has not been installed for the current user", and then it would just close. After a quick search on the Web, I found out that I had to use an older version of Wine, so I downloaded the 0.9.37 version and everything worked fine.
Note: Accordint to the Sorcerer's tech, this should work on all flavors of linux.
Tuesday, April 22, 2008
Create a custom keyboard layout in linux
Tuesday, April 8, 2008
Wrapping all dependencies in a jar
Yesterday I encountered this issue: I have been writing a client code that contacts a web service. I wanted to implement a modularized solution by wrapping all web service related code and dependencies in a library, so that I could jsut use this library in my client code, without having to worry about the WS specifics (ie the web service location, how to establish connection with it etc).
So I created a package that operates as a middle layer between the WS and the client code and then packaged it into a jar file. However, when I tried to use that in an applet I realised that I also had to distribute all of the jar's dependencies with the applet. (This problem wasn't obvious while running the program as a Java application, cause JVM was able to locate the dependencies in the file system.)
I made a little research and I found out that it is not possible to include other jars in a jar file, just like you can do with war files. The suggested solution is to unpackage all jars and re-package them into your own jar. Of course this isn't something that you can easily do by hand, especially if you think that the whole process has to be repeated each time you compile your project.
So this process has to be automated and ant is one way to do that. I will be demonstrating how this can be done on Netbeans.
First a few words about how Netbeans uses ant. In your project folder you will find two build files:
- $PROJ_HOME/build.xml
- $PROJ_HOME/nbproject/build-impl.xml
In our case we will use the -pre-jar target. The commands of this target will extract the library jar files into the built directory just before the jar target is called, so the latter will include them when creating the project's jar file. An example of the definition of this target is shown below.
<target name="-pre-jar">
<unjar src="${file.reference.axis-ant.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.activation.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.axis.jar-1}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.commons-discovery-0.2.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.commons-logging-1.0.4.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.jaxrpc.jar-1}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.log4j-1.2.8.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.saaj.jar-1}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.wsdl4j-1.5.1.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.activation.jar}"
dest="${build.classes.dir}"/>
<unjar src="${file.reference.mail.jar}"
dest="${build.classes.dir}"/>
</target>
We need an unjar element for each jar we want to repackage in our jar. The dest attributes specifies that the jars should be extracted in the project's build directory; you should leave that as it is.
Now, the value of the src attribute contains a reference to the jar file that will be unjar-ed. You can find the values you should use in the file $PROJ_HOME/nbproject/private/private.properties. This properties file contains key-value pairs with the names used by Netbeans for library files and the actual location of these files.
Thursday, April 3, 2008
SOAP attachments with AXIS
I wanted to create a Web Service that accepts a JPEG image as the input. The preferred way to send an image in a SOAP message is using SOAP attachments.
Below is a sample WSDL file for a service that accepts an image as input.
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="newWSDL" targetNamespace="http://www.example.com/example"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.example.com/example"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/">
<message name="isLabelAuthenticRequest">
<part name="labelImage" type="xsd:hexBinary"/>
</message>
<message name="isLabelAuthenticReply">
<part name="isAuthentic" type="xsd:boolean"/>
</message>
<portType name="isLabelAuthenticPortType">
<operation name="isLabelAuthenticOperation">
<input name="authenticInput" message="tns:isLabelAuthenticRequest"/>
<output name="authenticOutput"
message="tns:isLabelRegisteredOperationReply"/>
</operation>
</portType>
<binding name="isLabelAuthenticBinding" type="tns:isLabelAuthenticPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="isLabelAuthenticOperation">
<soap:operation/>
<input name="authenticInput">
<mime:multipartRelated>
<mime:part>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://www.example.com/example"/>
</mime:part>
<mime:part>
<mime:content part="labelImage" type="image/jpeg"/>
</mime:part>
</mime:multipartRelated>
</input>
<output name="authenticOutput">
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://www.example.com/example"/>
</output>
</operation>
</binding>
<service name="smartLabelDemoService">
<port name="isLabelAuthenticPort" binding="tns:isLabelAuthenticBinding">
<soap:address location="http://192.168.0.156:8080/Example/authentic"/>
</port>
</service>
</definitions>
The highlights of the WSDL file:
- The following namespace for SOAP must be used to enable support for attachments:
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/
- The message that will include an attachment is declared to be of type xsd:hexBinary
- The actual structure of this message is specified in the binding element. It is specified as a multipart message, with the MIME type of the second part set to image/jpeg.
The WSDL2Java utility offered by Axis, should be able to parse this wsdl document and generate the stubs successfully. (I have been using version 1.4 of Axis). Of course, for WSDL2Java to work, all the axis-related jars (ie all the jars in the folder $AXIS_HOME/lib) must be present in the CLASSPATH. Furthermore, for attachment support, we also need mail.jar and activation.jar. The first one is part of the Java Mail API and the second on can be found in the JavaBeans Activation Framework.
However I was getting the following error message when I tried to implement and test the web service:
http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: Bad envelope tag: html org.apache.axis.message.EnvelopeBuilder.startElement(EnvelopeBuilder.java:71) ...
I could only understand what was causing this when I used the tcpmon utility to monitor the TCP connections. This actually revealed that the server was returning an HTML document (rather than a SOAP message) containing an error message:
java.lang.RuntimeException: No support for attachments org.apache.axis.Message.setup(Message.java:372) ...
So, it was a matter of just enabling attachment support on the server side. This can be done by simply copying mail.jar and activation.jar under the location where axis has been deployed, ie under the directory $CATALINA_HOME/webapps/axis/lib.
Tuesday, January 15, 2008
Programmatically adding a jenia4faces Popup component to a Netbeans 6.0 VWP project
This post describes how you can programmatically add a jenia4faces PopupFrame component to a Netbeans 6.0 Visual Web project.
There are various reasons why you would need to do that. In my case the requirement was that we needed a link in each row of a dynamically-created table that brings up a popup frame that is used for editing the database entry for this table row. Since the table is created dynamically, the same must be done with the PopupFrame component.
First you need to add the Jenia servlet in your web.xml file. This is a required step for using any Jenia component, no matter whether you add it to your page through JSP or from within Java code.
<servlet> <servlet-name>Jenia servlet</servlet-name> <servlet-class>org.jenia.faces.util.Servlet</servlet-class> <load-on-startup> </load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jenia servlet</servlet-name> <url-pattern>/jenia4faces/*</url-pattern> </servlet-mapping>
Next you need to import the appropriate Java class in your Page bean. In the case of the PopupFrame this is
Now you can initialize the component and set its basic properties.
// Create the popup component
HtmlPopupFrame popup = new HtmlPopupFrame();
// Set its properties
popup.setId("editPopup");
popup.setCenter("true");
popup.setWidth("550px");
popup.setHeight("400px");
popup.setTitle("Edit Task");
popup.setResizable("false");
popup.setImmediate(true);
Now it's the most tricky part: setting the method bindings for the actionOpen and actionClose properties. First we get a reference to the EL Expression Factory and create a MethodExpression.
FacesContext fc = FacesContext.getCurrentInstance();
ELContext elctx = fc.getELContext();
ExpressionFactory elFactory = fc.getApplication().getExpressionFactory();
MethodExpression openExpression = elFactory.createMethodExpression(elctx,
"#{Staff.fireEditPopup}", String.class, new Class[]{});
MethodBindingMethodExpressionAdapter bind1 = new MethodBindingMethodExpressionAdapter(openExpression); popup.setActionOpen(bind1);
The PopupFrame component renders as a <a>. It can accept either plain text or an image as a child, so that it displays as a simple (text) hyperlink or an image hyperlink. This leaves us with an option to use either a StaticText or am ImageComponent in Netbeans. If you are not using Netbeans, you can add the respective standard JSF components (eg. <h:outputText>).
// Create an image component
ImageComponent edit = new ImageComponent();
edit.setId("editLink");
edit.setUrl("resources/edit.png");
edit.setHeight(16);
edit.setWidth(16);
// Add the image to the popup (as a child)
popup.getChildren().add(edit);
The Popup component is now ready. We can add it to the component tree. (In my case, I am adding it to the tablecolumn.)
Friday, January 11, 2008
awk: Simple and combined patterns
Thursday, November 29, 2007
Displaying a spinning wheel image during a Dynamic Faces Ajax transaction.
I am currently building a JSF application using Netbeans 6.0. For this project I use a wide range of Woodstock components and also the Dynamic Faces extension to ajaxify some of these . As some Ajax transactions may take some time to complete, I wanted to provide the user with some visual feedback that something is happening in the background.
So these are the steps you need to follow in order to display a spinning wheel gif while the client is waiting for the server response.
- Visit the Ajax loading gif generator and create a gif. There are plenty of similar sites in the web.
- And an image component to the web page. This must be initially hidden, so specify visibility: hidden in the style attribute of the image. I suggest this property over the display: [none/block], because the visibility property reserves the space occupied by a hidden component.
-
Create a Javascript function that toggles the image visibility and makes it visible.
This function receives one string argument (the id of the image) and uses the prototype dollar function.
var showLoading=function(element) { var loadingImage = $(element); loadingImage.style.visibility = 'visible'; } - Now we need to call this method when the ajax transaction is initiated. This happens in the onClick event action method of a button or hyperlink component, by calling the DynaFaces.Tx.fire(...) function. So we just need to add a call to the showLoading function right before this.
-
The final step is to hide the image when the transaction completes. This can be done by adding the image component to the "re-render" list of components of the AjaxTransaction component. This is enough, because when the image component is re-rendered when the response is received, it uses the initial value of the visibility property, which is set to 'hidden'.
Thursday, November 15, 2007
Internationalizing Woodstock components
Project Woodstock offers a set of very useful JSF components, some of which are included by default in NetBeans 6.0. The labels, messages etc used by these components can be internationalized by following these steps:
- Create a new resource bundle properties file woodstock.properties. An existing one can be used, but it's better to keep things clean.
-
Declare the bundle in web.xml.
<context-param>Note that you must use the fully qualified name of the properties file (if it is placed in a package).
<param-name>com.sun.webui.theme.THEME_RESOURCES</param-name>
<param-value>my.package.woodstock</param-value>
</context-param> - The Woodstock Theme Doc pages include a list with all the key-value pairs for woodstock messages. You can override these in the new properties file.
Tuesday, November 13, 2007
Dynamic Faces and encoding problems
Dynamic Faces is part of the JSF extensions project, and it offers an easy way to ajaxify plain old JSF components. However, there is a problem (I would call it a bug) with international characters. Even if you specify UTF-8 as the encoding of the HTML/JSP page, the partial AJAX response is always in ISO-8859-1. This can be easily verified with the Netbeans HTTP monitor: under the Session tab, the value for the javax.faces.request.charset is UTF-8 before the request, and changes to ISO-8859-1, after the request. This results in lots of questionmarks or strange symbols in the page and it actually makes it impossible to use Dynamic Faces with an internationalized application.
The solution came from Matthias Unverzagt's comment in a number of blogs/forums, such as Hong's blog. Matthias suggests that the line
needs to be added to the com.sun.faces.extensions.avatar.lifecycle.AsyncResponse's installOnOffResponse method.
This proved quite of a challenge for me, since it required recompilation of the jsf-extensions-dynamic-faces-0.1.jar, which was a bit tricky, as this jar appeared in a number of locations on my system:
- ~/.netbeans/6.0beta2/config/org-netbeans-modules-visualweb-complib/installed-complibs/dynamicfaces02
- ${netbeans_installation_dir}/visualweb1/modules/ext
So, here are the steps I followed (with NetBeans Beta2):
- I extracted jsf-extensions-dynamic-faces-0.1-sources.jar, found in the first directory above.
- I created a new Netbeans Java project with the extracted sources.
-
In order to compile this project a number of libraries and jars had to be added to the project's classpath:
- libraries: JSF 1.2, Web UI Components
- jars el-api.jar, jsp-api.jar, servlet-api.jar, shale-remoting.jar
-
I opened the file AsyncResponse.java file, from the com.sun.faces.extensions.avatar.lifecycle package and added the line
context.getExternalContext().setResponseCharacterEncoding("UTF-8");to the installOnOfResponse method's body. It probably doesn't matter where exactly you place this line; I added it as the second line of this method, right between the other two statements of this method.
- I extracted the jsf-extensions-dynamic-faces-0.1.jar file from the ${netbeans_installation_dir}/visualweb1/modules/ext directory and replaced the .class files in the lifecycle subdirectory with the ones I just compiled.
- That's all! I then recompiled and deployed my web application (so that the patched copy of jsf-extensions-dynamic-faces-0.1.jar would be used) and I was set.
Wednesday, November 7, 2007
Turning off the system beeper
This is the magic command that turns off the system beeper:
And just for completence, this is how to turn it on again:
Update (Thanks to the ArsGeek site.) This only works for the current session - the beeper is only muted till the next reboot. In order to make the beeper silent for ever, you need to add the following line to the file /etc/modprobe.d/blacklist:
Ubuntu: Connecting to a Windows shared network drive
I got a new PC at work and I made a clean installation of Ubuntu Gutsy Gibbon 7.10, so I had to make some configuration from scratch. This is a quick note about how I connected to our file server, using samba
From the Places menu, select Connect to server. From the window that appears, select Windows share in the Type drop-down. Then provide the server's IP in the Server field and the folder's name in the Folder field and you are done.
Wednesday, October 31, 2007
Datasources, Tomcat and Netbeans
I am currently developing a JSF application using NetBeans 6.0 and Tomcat 6.0.14. When I tried to deploy the application on our production server (by just dumping the .war file in Tomcat's webapps directory, it didn't work properly. I could access the app's start page, but it failed to render the following pages.
A look in tomcat's log files revealed that there was a problem with the mysql driver.
I tried to make sure that the mysql-connector jar is included in the project's imported libraries and that it can be found in META-INF/lib, but this didn't help. I later found out that in Netbeans, under Tools→Servers→Deployment there is a "Enable JDBC driver deployment option". Disabling this resulted in a replication of the problem on my development machine, even when using NetBeans. So I had to find out what it was that NetBeans was doing when this option was enabled and repeat it on the production server.
I started making a research on the net, based on the error message I was getting. The oslution proposed by most people was to place the mysql driver jar in tomcat's common/lib directory and nowhere else, but this just wouldn't do the trick for me. I also checked that the datasource's declarations in the web.xml and context.xml files were correct.
A final attempt to go through the steps to create and declare a datasource as described in tomcat's website revealed a small detail in step 1: the driver jar file needs to be placed in the $CATALINA_HOME/lib directory rather than $CATALINA_HOME/common/lib.
Still remains to check whether there is a difference in the directory structure in versions 5.5 and 6.0 of tomcat, since no common directory appears to exist in installations of tomcat 6.0.
Friday, September 21, 2007
Setting the time on linux.
For some reason I find the manpage for the date command a bit confusing. Here is how you can set the time in a linux box through the command line:
The system's hardware clock can be synchronized with this time by executing the following command:
Tuesday, September 4, 2007
Allowing ssh access with iptables.
This post describes how you can allow incoming ssh connections from a certain IP address, using iptables.
First of all, the current list of iptables rules can be viewed with the commandA new rule to allow access from the IP 100.100.100.100 can be appended to this list with the command
However, in my case this didn't work, because the rule was appended to the end of the list, which means that it was preceded by a DROP rule that blocked ssh access to all IP addresses that did not explicitly have an ACCEPT rule. So, I had to add the rule further up in the list. This can be achieved with the -I switch.
Thursday, August 30, 2007
How to create a Datasource and a Connection Pool on Tomcat.
This post describes how you can setup a Connection Pool for a web application under Tomcat. I have been using NetBeans 5.5.1, with bundled Tomcat (version 5.5.17). NetBeans does offer some visual tools to create datasources and connection pools, but as far as I understand, these only work with the Sun Application Server.
Before doing anything else, the following jars are required:
- mysql-connector-java-5.0.7-bin.jar
- commons-dbcp-1.2.2.jar
- commons-collections-3.2.jar
- commons-pool-1.3.jar
They need to be placed in the WEB-INF/lib subdirectory of the webapp. (Of course this can also be done through the NetBeans IDE.) Actually, although I read on various websites about the last 3 jars, I am not absolutely sure if they are definitely required. Even after I removed them, my application continued to work fine.
Important: The MySQL Connector/J jar needs to be placed under the Tomcat common/lib/ subdirectory. (For the bundled with the NetBeans IDE version of Tomcat, this directory is $NETBEANS_HOME/enterprise3/apache-tomcat-5.5.17/common/lib.
1. Add this to the context.xml file (which is located in the META-INF directory of the web-app.
<Context path="/ePmashup">
<Resource
name="jdbc/dataSource"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
username="username"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/databaseName"
maxWait="1000"
removeAbandoned="true"
maxActive="30"
maxIdle="10"
removeAbandonedTimeout="60"
logAbandoned="true"/>
</Context>
2. Create a DataSource object in the application code.
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
datasource = (DataSource)envContext.lookup("jdbc/dataSource");
public void init() throws ServletException {
super.init();
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
datasource = (DataSource)envContext.lookup("jdbc/dataSource");
} catch( NamingException ne ) {
throw new RuntimeException( "Unable to aquire data source", ne );
}
}
3. Now, a connection from the pool can be retrieved and used like this:
Tuesday, July 31, 2007
Popup windows in JSF
Press me to bring up a popup window
</h:commanndLink>
