Showing posts with label JBoss Portal. Show all posts
Showing posts with label JBoss Portal. Show all posts

26 July, 2007

Portals and Portlets with GWT modules

Last week I considered possibility of using portlets and GWT modules together (i.e.: GWT inside portlet's window).
And I'm coming to conclusion that it works. And it works pretty good.

I created several portlets with GWT modules, and also I wrapped some of my GWT applications in a portlets.

One of them - ChatPortal (simple application for messaging).

First edition of ChatPortal worked well. But I couldn't put several instances of ChatPortlet windows into the page and couldn't move portlet's window within the page.

I investigated these problems and found solution how to resolve theirs.

I changed some ChatPortal's code and Second edition works excellent!

Now I'm using a "-xs" ("cross-site") version of my module's, which GWT (v1.4) compiler produces.
I.e.: instead of gwt.js or xqx.web.chat.Chat.nocache.js scripts I use xqx.web.chat.Chat-xs.nocache.js.

And also I found way how to have several windows instances for one portlet within one page. I wrote function, which performs tree-walking over the HTML DOM and finds places where to put my widgets.

See sources below, they'll say more.

Dashboard with several instances of portlets with same GWT modules



Moving of portlet with GWT module





ChatPortlet.java
public class ChatPortlet extends GenericPortlet {

AtomicInteger counter=new AtomicInteger(0);

protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException {
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.println("<script language='javascript' src='" + renderRequest.getContextPath() + "/xqx.web.chat.Chat-xs.nocache.js'></script>");
writer.println("<div id='xqx_web_chat_Chat-"+counter.incrementAndGet()+"'></div>");

writer.close();
}

...
}


Chat.java
package xqx.web.chat.client;
...
public class Chat implements EntryPoint {
...
private FlowPanel messagesPanel = new FlowPanel();
private ScrollPanel messagesScrollPanel = new ScrollPanel(messagesPanel);

private TextArea inputTextArea = new TextArea();
private ScrollPanel inputScrollPanel = new ScrollPanel(inputTextArea);
...
public void onModuleLoad() {

messagesScrollPanel.setStyleName("xqx_messagesScrollPane");
messagesScrollPanel.addStyleName("xqx_etchedBorder");

inputTextArea.setStyleName("xqx_input");
...

String slotId = getEmptySlotId(RootPanel.getBodyElement(), "xqx_web_chat_Chat");
RootPanel rootPanel = RootPanel.get(slotId);

if (rootPanel != null) {
...
rootPanel.add(messagesScrollPanel);
rootPanel.add(inputScrollPanel);
rootPanel.add(sendButton);
...
}

...
}

private String getEmptySlotId(Element element, String idPrefix) {
int count = DOM.getChildCount(element);
if (count == 0) {
String id = DOM.getElementAttribute(element, "id");
if (id != null && id.startsWith(idPrefix)) {
return id;
}
} else {
for (int i = 0; i < count; i++) {
String id = getEmptySlotId(DOM.getChild(element, i), idPrefix);
if (id != null)
return id;
}
}
return null;
}

private void printMessages(Message[] messages) {
...
}
}



I use GWT v1.4 beta and JBoss Portal 2.6.



You may download these sources from Xantorohara.blogspot.com samples

24 July, 2007

JBoss Portal and Proxy Server

"News" and "Weather" pages didn't work in my JBoss Portal.
My computer located in the the local network area and I use Internet via HTTP proxy server.

Today I found a solution how to configure my JBoss Portal in order to connect it with Internet.

The simplest way is to add specific properties to the JAVA_OPTS variable.

I added one string at the beginning of run.bat file:

set JAVA_OPTS=-Dhttp.proxyHost=<Proxy Host> -Dhttp.proxyPort=<Proxy Port>

In Linux it should be:

JAVA_OPTS="-Dhttp.proxyHost=<Proxy Host> -Dhttp.proxyPort=<Proxy Port>"

You should replace values "Proxy Host" and "Proxy Port" with actual data for your network.

Now all portlets are working and I'm happy.

18 July, 2007

Inter Portlet Communication in JBoss Portal 2.6

Have you tried to deploy HelloWorldIPC portlet (from Portlet Swap) into JBoss Portal 2.6?
I've tried, but it was unsuccessful.
This portlet works in previous version of JBoss Portal, but doesn't work in 2.6, because some APIs in JBoss Portal was slightly changed.
I've read some developers documentation and found way to resolve this problem, and I created sample of Inter Portlet Communication for JBoss Portal 2.6.
I think, it will be useful for developers. You may see sources below.



Project files

./build.properties
./build.xml
./local.properties
./src
./src/META-INF
./src/META-INF/jboss-service.xml
./src/WEB-INF
./src/WEB-INF/portlet-instances.xml
./src/WEB-INF/portlet.xml
./src/WEB-INF/web.xml
./src/WEB-INF/xlamipc-object.xml
./src/xqx
./src/xqx/web
./src/xqx/web/xlam
./src/xqx/web/xlam/XLamMasterPortlet.java
./src/xqx/web/xlam/XLamSlavePortlet.java


jboss-service.xml

<?xml version="1.0" encoding="UTF-8"?>

<server>
<mbean code="org.jboss.portal.core.event.PortalEventListenerServiceImpl"
name="portal:service=ListenerService,type=ipc_listener" xmbean-dd=""
xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
<xmbean/>
<depends
optional-attribute-name="Registry" proxy-type="attribute">portal:service=ListenerRegistry
</depends>
<attribute name="RegistryId">ipc_listener</attribute>
<attribute name="ListenerClassName">xqx.web.xlam.XLamSlavePortlet$Listener</attribute>
</mbean>
</server>


portlet-instances.xml

<?xml version="1.0" standalone="yes"?>
<deployments>
<deployment>
<instance>
<instance-id>XLamMasterPortletInstance</instance-id>
<portlet-ref>XLamMasterPortlet</portlet-ref>
</instance>
</deployment>
<deployment>
<instance>
<instance-id>XLamSlavePortletInstance</instance-id>
<portlet-ref>XLamSlavePortlet</portlet-ref>
</instance>
</deployment>

</deployments>


portlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0">

<portlet>
<portlet-name>XLamMasterPortlet</portlet-name>
<portlet-class>xqx.web.xlam.XLamMasterPortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
<portlet-mode>HELP</portlet-mode>
</supports>
<portlet-info>
<title>XLam Master Portlet</title>
</portlet-info>
</portlet>

<portlet>
<portlet-name>XLamSlavePortlet</portlet-name>
<portlet-class>xqx.web.xlam.XLamSlavePortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<portlet-info>
<title>XLam Slave Portlet</title>
</portlet-info>
</portlet>

</portlet-app>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>



xlamipc-object.xml

<?xml version="1.0" encoding="UTF-8"?>
<deployments>
<deployment>
<if-exists>overwrite</if-exists>
<parent-ref>default</parent-ref>
<page>
<page-name>XLamIPC</page-name>
<listener>ipc_listener</listener>
<window>
<window-name>XLamMasterPortletWindow</window-name>
<instance-ref>XLamMasterPortletInstance</instance-ref>
<region>left</region>
<height>0</height>
</window>

<window>
<window-name>XLamSlavePortletWindow</window-name>
<instance-ref>XLamSlavePortletInstance</instance-ref>
<region>center</region>
<height>0</height>
</window>
</page>
</deployment>

</deployments>


XLamMasterPortlet.java

package xqx.web.xlam;


import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class XLamMasterPortlet extends GenericPortlet
{
protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException
{
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.println("<form action='" + renderResponse.createActionURL() + "' method='post'>");
writer.println("<input name='txt' type='text'/>");
writer.println("<input type='submit' value='Send to Slave' />");
writer.println("</form>");
writer.close();
}

protected void doHelp(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException
{
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.write("Visit <a href='http://xantorohara.blogspot.com/'>Xantorohara blog</a> for another info.");
writer.close();
}

public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException, IOException
{
//prevent super exception
}
}


XLamSlavePortlet.java

package xqx.web.xlam;

import org.jboss.portal.WindowState;
import org.jboss.portal.api.node.PortalNode;
import org.jboss.portal.api.node.event.PortalNodeEvent;
import org.jboss.portal.api.node.event.PortalNodeEventContext;
import org.jboss.portal.api.node.event.PortalNodeEventListener;
import org.jboss.portal.api.node.event.WindowActionEvent;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletSecurityException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class XLamSlavePortlet extends GenericPortlet
{
public static class Listener implements PortalNodeEventListener
{
public PortalNodeEvent onEvent(PortalNodeEventContext context, PortalNodeEvent event)
{
PortalNode node = event.getNode();
String nodeName = node.getName();
WindowActionEvent newEvent = null;
if (nodeName.equals("XLamMasterPortletWindow") && event instanceof WindowActionEvent)
{
WindowActionEvent wae = (WindowActionEvent) event;
PortalNode windowB = node.resolve("../XLamSlavePortletWindow");
if (windowB != null)
{
newEvent = new WindowActionEvent(windowB);
newEvent.setMode(wae.getMode());
newEvent.setWindowState(WindowState.MAXIMIZED);
newEvent.setParameters(wae.getParameters());
return newEvent;
}
}
return context.dispatch();
}
}

public void processAction(ActionRequest request, ActionResponse response) throws PortletException, PortletSecurityException, IOException
{
String txt = request.getParameter("txt");
if (txt != null)
{
response.setRenderParameter("txt", txt);
}
}


protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, PortletSecurityException, IOException
{
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.write("Message from Master:");
String txt = renderRequest.getParameter("txt");
writer.println("txt: " + txt);
writer.close();
}
}


build.properties

project.name=XLamIPC


build.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="xlam" default="war">

<property file="local.properties"/>
<property file="build.properties"/>

<property name="build" value="build"/>
<property name="jarfile" value="${project.name}.jar"/>
<property name="warfile" value="${project.name}.war"/>
<property name="sarfile" value="${project.name}.sar"/>

<path id="classpath">
<fileset dir="${jbossportal.lib}" includes="**/*.jar"/>
</path>

<target name="clean">
<delete dir="${build}"/>
</target>

<target name="jar" depends="clean">
<mkdir dir="${build}/bin"/>
<javac srcdir="src" destdir="${build}/bin" classpathref="classpath" debug="true"/>
<jar basedir="${build}/bin" jarfile="${build}/${jarfile}"/>
</target>

<target name="war" depends="jar">
<copy file="${build}/${jarfile}" todir="${build}/war/WEB-INF/lib"/>
<copy todir="${build}/war/WEB-INF">
<fileset dir="src/WEB-INF"/>
</copy>
<jar basedir="${build}/war" jarfile="${build}/${warfile}"/>
</target>

<target name="sar" depends="war">
<copy file="${build}/${warfile}" todir="${build}/sar"/>
<copy file="${build}/${jarfile}" todir="${build}/sar/lib"/>
<copy todir="${build}/sar/META-INF">
<fileset dir="src/META-INF"/>
</copy>
<jar basedir="${build}/sar" jarfile="${build}/${sarfile}"/>
</target>

<target name="undeploy">
<delete file="${jbossportal.node}/deploy/${sarfile}"/>
</target>

<target name="deploy" depends="undeploy, sar">
<copy file="${build}/${sarfile}" todir="${jbossportal.node}/deploy"/>
</target>
</project>


local.properties (* You should replace paths with your real data)

jdk.home=E:/devenv/tools/jdk-1.5.0_04

jbossportal.home=E:/devenv/tools/jboss-portal-2.6
jbossportal.node=${jbossportal.home}/server/default
jbossportal.lib=${jbossportal.node}/deploy/jboss-portal.sar/lib



You may download these sources from Xantorohara.blogspot.com samples

13 July, 2007

Portlets and GWT

I've tried to search any useful samples of development Portlets with GWT.
But I found only one such sample: Developing_Portlets_with_GWT.

Now I'm investigating possibility of development JSR168 Portlets together with Google Web Tolkit (I'm using JBoss Portal 2.6 and GWT 1.4).

This subject too interesting for me, and, I think, for many other developers, because:
  • GWT is very useful stuff for development AJAX- based web applications.
  • JBoss Portal is powerful and popular platform for this.

If these technologies work together, it will be great!

But there are problems and questions present on this way. I'm going to say about these problems in next posts.
This post about simple portlet based on GWT:


This portlet only receives time from server every second and repaints this time.
There are some source code presented below (I think it helps for someone).



Project files

./build.properties
./build.xml
./local.properties
./src
./src/WEB-INF
./src/WEB-INF/portlet-instances.xml
./src/WEB-INF/portlet.xml
./src/WEB-INF/web.xml
./src/WEB-INF/xlam-object.xml
./src/xqx
./src/xqx/web
./src/xqx/web/xlam
./src/xqx/web/xlam/client
./src/xqx/web/xlam/client/rpc
./src/xqx/web/xlam/client/rpc/XLamService.java
./src/xqx/web/xlam/client/rpc/XLamServiceAsync.java
./src/xqx/web/xlam/client/Time.java
./src/xqx/web/xlam/client/XLam.java
./src/xqx/web/xlam/public
./src/xqx/web/xlam/public/XLam.html
./src/xqx/web/xlam/server
./src/xqx/web/xlam/server/XLamServiceImpl.java
./src/xqx/web/xlam/XLam.gwt.xml
./src/xqx/web/xlam/XLamPortlet.java


portlet-instances.xml

<?xml version="1.0" standalone="yes"?>
<deployments>
<deployment>
<instance>
<instance-id>XLamPortletInstance</instance-id>
<portlet-ref>XLamPortlet</portlet-ref>
</instance>
</deployment>
</deployments>


portlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0">

<portlet>
<portlet-name>XLamPortlet</portlet-name>
<portlet-class>xqx.web.xlam.XLamPortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
<portlet-mode>EDIT</portlet-mode>
<portlet-mode>HELP</portlet-mode>
</supports>
<portlet-info>
<title>XLam Portlet</title>
</portlet-info>
</portlet>
</portlet-app>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<servlet>
<servlet-name>XLamService</servlet-name>
<servlet-class>
xqx.web.xlam.server.XLamServiceImpl
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>XLamService</servlet-name>
<url-pattern>/XLamService</url-pattern>
</servlet-mapping>

</web-app>


xlam-object.xml

<?xml version="1.0" encoding="UTF-8"?>
<deployments>
<deployment>
<if-exists>overwrite</if-exists>
<parent-ref>default</parent-ref>
<page>
<page-name>XLam</page-name>
<window>
<window-name>XLamPortletWindow</window-name>
<instance-ref>XLamPortletInstance</instance-ref>
<region>left</region>
<height>0</height>
</window>
</page>
</deployment>
</deployments>


XLamService.java

package xqx.web.xlam.client.rpc;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import xqx.web.xlam.client.Time;

public interface XLamService extends RemoteService {

Time getTime();

public static class App {
private static xqx.web.xlam.client.rpc.XLamServiceAsync ourInstance = null;

public static synchronized xqx.web.xlam.client.rpc.XLamServiceAsync getInstance() {
if (ourInstance == null) {
ourInstance = (xqx.web.xlam.client.rpc.XLamServiceAsync) GWT.create(XLamService.class);
((ServiceDefTarget) ourInstance).setServiceEntryPoint(GWT.getModuleBaseURL() + "XLamService");
}
return ourInstance;
}
}
}


XLamServiceAsync.java

package xqx.web.xlam.client.rpc;

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface XLamServiceAsync
{
void getTime(AsyncCallback callback);
}



Time.java

package xqx.web.xlam.client;

import com.google.gwt.user.client.rpc.IsSerializable;

public class Time implements IsSerializable
{
private String time;

public String getTime() { return time; }

public Time(String message) { this.time = message; }

public Time() { }
}


XLam.java

package xqx.web.xlam.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import xqx.web.xlam.client.rpc.XLamService;

public class XLam implements EntryPoint
{
private Timer timer;
private Label label = new Label("Wait...");

private class CallBack implements AsyncCallback
{
public void onFailure(Throwable caught)
{
timer.cancel();
Window.alert(caught.getMessage());
}

public void onSuccess(Object result)
{
label.setText(((Time) result).getTime());
}
}

private CallBack callBack = new CallBack();

public void onModuleLoad()
{
RootPanel.get("uid").add(label);

timer = new Timer()
{
public void run()
{
XLamService.App.getInstance().getTime(callBack);
}
};
timer.scheduleRepeating(1000);
}
}


XLam.html (dummy)

<html>
<head>
<title>XLam</title>
</head>
<body>
<script language='javascript' src='xqx.web.xlam.XLam.nocache.js'></script>
<div id='uid'></div>
</body>
</html>


XLamServiceImpl.java

package xqx.web.xlam.server;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import xqx.web.xlam.client.Time;
import xqx.web.xlam.client.rpc.XLamService;

import java.text.DateFormat;
import java.util.Date;

public class XLamServiceImpl extends RemoteServiceServlet implements XLamService
{
public Time getTime()
{
String out = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(new Date());
return new Time(out);
}
}


XLamPortlet.java

package xqx.web.xlam;

import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletSecurityException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class XLamPortlet extends GenericPortlet
{
protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, PortletSecurityException, IOException
{
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.println("<script language='javascript' src='" + renderRequest.getContextPath() + "/xqx.web.xlam.XLam.nocache.js'></script>");
writer.println("GWT time:");
writer.println("<div id='uid'></div>");
writer.close();
}

protected void doHelp(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, PortletSecurityException, IOException
{
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.write("Help");
writer.close();
}

protected void doEdit(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, PortletSecurityException, IOException
{
renderResponse.setContentType("text/html");
PrintWriter writer = renderResponse.getWriter();
writer.println("Edit");
writer.close();
}
}


XLam.gwt.xml

<module>
<inherits name='com.google.gwt.user.User'/>
<entry-point class='xqx.web.xlam.client.XLam'/>
<servlet path="/XLamService" class="xqx.web.xlam.server.XLamServiceImpl"/>
</module>




Build, deploy and view (http://localhost:8080/portal/auth/portal/default/XLam)

For building purpose you may use this Ant file:

build.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="xlam" default="war">

<property file="local.properties"/>
<property file="build.properties"/>

<property name="build" value="build"/>

<property name="jarfile" value="${project.name}.jar"/>
<property name="warfile" value="${project.name}.war"/>

<path id="classpath">
<fileset dir="${jbossportal.lib}" includes="**/*.jar"/>
<fileset dir="${gwt.home}" includes="**/*.jar"/>
<fileset file="${jarfile}"/>
<pathelement location="src"/>
</path>

<target name="clean">
<delete dir="${build}"/>
</target>

<target name="jar" depends="clean">
<mkdir dir="${build}/bin"/>
<javac srcdir="src" destdir="${build}/bin" classpathref="classpath" debug="true"/>
<jar basedir="${build}/bin" jarfile="${build}/${jarfile}"/>
</target>

<target name="war" depends="jar, gwt">
<copy todir="${build}/war">
<fileset dir="${build}/www/${project.package}.${project.name}">
<exclude name="**/*cache.xml"/>
<exclude name="**/history.html"/>
</fileset>
</copy>

<copy todir="${build}/war/WEB-INF">
<fileset dir="src/WEB-INF"/>
</copy>

<copy todir="${build}/war/WEB-INF/lib">
<fileset file="${build}/${jarfile}"/>
<fileset file="${gwt.home}/gwt-servlet.jar"/>
</copy>

<jar basedir="${build}/war" jarfile="${build}/${warfile}"/>
</target>

<target name="gwt">
<mkdir dir="${build}/www"/>
<java classname="com.google.gwt.dev.GWTCompiler" fork="true" dir="${build}" classpathref="classpath">
<arg line="-out www ${project.package}.${project.name}"/>
</java>
</target>

<target name="shell" depends="jar">
<delete dir="${build}/www"/>
<mkdir dir="${build}/www"/>
<java classname="com.google.gwt.dev.GWTShell" fork="true" dir="${build}" classpathref="classpath">
<arg line="-out www ${project.package}.${project.name}/${project.name}.html"/>
</java>
</target>

<target name="undeploy">
<delete file="${jbossportal.node}/deploy/${warfile}"/>
</target>

<target name="deploy" depends="undeploy, war">
<copy file="${build}/${warfile}" todir="${jbossportal.node}/deploy"/>
</target>
</project>


build.properties

project.name=XLam
project.package=xqx.web.xlam
project.sources=xqx/web/xlam


local.properties (* You should replace paths with your real data)

jdk.home=E:/devenv/tools/jdk-1.5.0_04

jbossportal.home=E:/devenv/tools/jboss-portal-2.6
jbossportal.node=${jbossportal.home}/server/default
jbossportal.lib=${jbossportal.node}/deploy/jboss-portal.sar/lib

gwt.home=E:/devenv/tools/gwt-windows-1.4.10
gwt.docs.index=${gwt.home}/doc/html/gwt.html






You may download these sources from Xantorohara.blogspot.com samples