2010. március 5., péntek

Liferay portlet fejlesztése SDK és ServiceBuilder segítségével

A téma bemutatásához egy minta portletet fogunk elkészíteni. Ez egy egyszerű üzenőfal lesz, ami listázza az eddig beírt üzeneteket, és lehet újat is felvenni.

Első teendő az SDK beszerzése, ezt az alábbi utasítással tehejük meg:
svn co svn://svn.liferay.com/repos/public/plugins/trunk  --username guest
A jelszó üres. Ezzel letöltöttük a legfrissebb forrást. Mielőtt használatba vennénk, szükséges beállítani az eléréseket. Ehhez hozzuk létre a gyökerébe egy build.{username}.properties fájlt, az alábbi tartalommal:
app.server.dir=${user.home}/workspace/portal/bundles/tomcat-6.0.24
Értelemszerűen átírva, hogy egyezzen a használt rendszerrel. Ezután a portlet könyvtárban kiadva az alábbi parancsot, létrejön a portletünk váza:
./create.sh messagewall "Message Wall"
Ki is próbálhatjuk, ha a portlet mappájában buildelünk ant-al, akkor lefordítja, összepakolja és bemásolja a beállított deploy mappába, tehát azonnal használható is lesz.

Szükségünk lesz egy service.xml fájlra, ez fogja leírni az adatbázis modelljét, amiből a ServiceBuilder le fogja generálni a szükséges fájlokat. Tehát a WEB-INF-be hozzunk létre egy service.xml fájlt, az alábbi tartalommal:

<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_0_0.dtd">

<service-builder package-path="hu.example.messagewall">
<namespace>MessageWall</namespace>
<entity name="Message" local-service="true" remote-service="false">

<!-- PK fields -->

<column name="messageId" type="long" primary="true" />

<!-- Audit fields -->

<column name="message" type="String" />

<!-- Order -->

<order by="desc">
<order-column name="message" />
</order>
</entity>
</service-builder>
Az osztályok legenerálásához az alábbi utasítás használható:
ant build-service
Ez nem történik meg általános buildelésnél, de csak akkor van rá szükség, ha a service.xml vagy az Impl oszályok változnak.

Mivel szeretnénk Eclipse-el fejleszteni, ezért létre kell hoznunk egy projectet neki. Ehhez indítsunk egy Dynamic Web Project-et, írjuk be a nevét, töröljük a Project Contents pontot, majd válasszuk ki a portlet mappáját. Válasszunk Runtime-t, majd Next. Az src legyen docroot\WEB-INF\src, a build pedig docroot\WEB-INF\classes, majd Next. Itt a webcontent-et írjuk át docroot-ra, majd finish. A path errorok megoldására adjuk hozzá,hogy függjön a portál projecttől, majd a view.jsp-ben a taglib URI végéről a 2_0-t szedjük le, tehát így nézzen ki a sor:
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
Végül adjuk hozzá a service mappát forrásként, ezzel megszűnt az összes error. Ezután fel kell venni egy új üzenetet létrehozó metódust a service-be. Ehhez írjuk át a MessageLocalServiceImpl osztályt:
public class MessageLocalServiceImpl extends MessageLocalServiceBaseImpl  {
public void createMessage(String msg) {
try {
Message m = createMessage(counterLocalService.increment());
m.setMessage(msg);
updateMessage(m);
} catch (SystemException e) {
e.printStackTrace();
}

}
}
Ezután generáljuk le újra a service osztályokat. Végül fel kell vennünk egy portletet, ami majd az action-t kezeli:
public class MessageWallPortlet extends MVCPortlet {
@Override
public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {
MessageLocalServiceUtil.createMessage(ParamUtil.getString(actionRequest, "newMessage"));
}
}
Majd meg kell mondanunk, hogy ezt a portletet használja, ehhez a portet.xml-t írjuk át:
<portlet-class>hu.example.messagewall.portlet.MessageWallPortlet</portlet-class>
Ezután meg kell még írnunk a megjelnítést, ez a view.jsp-be kerül:
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>


<%@page import="java.util.List"%>
<%@page import="hu.example.messagewall.model.Message"%>
<%@page import="hu.example.messagewall.service.persistence.MessageUtil"%>
<%@page import="hu.example.messagewall.service.impl.MessageLocalServiceImpl"%>
<%@page import="hu.example.messagewall.service.MessageLocalServiceUtil"%><portlet:defineObjects />

This is the <b>Message Wall2</b>.
Messages:
<%

List<Message> messages=MessageLocalServiceUtil.getMessages(-1,-1);
for(Message m:messages){
%>
<p><%=m.getMessage() %></p>
<%
}
%>

Create new message:
<form action="<portlet:actionURL/>" method="post">
Message:<input type="text" name="<portlet:namespace/>newMessage"/><input type="submit"/>
</form>
Ezzel készen is vagyunk, lefordítva, kideployolva már használható is az üzenőfal.

Kiegészítés:


Eclipse project létrehozásához használhatjuk az ant setup-eclipse utasítást, ezután importálhatjuk a workspace-be.

2010. március 3., szerda

Liferay portál fejlesztése

Előkerülhet az igény, hogy magát a portált fejlesszük, és nem csak témákat vagy portleteket hozzá. Mivel nyílt forrású programról van szó, ezért nem áll utunkba semmi a cél eléréséhez. Ehhez először is be kell szereznünk a forrást. Ezt az SVN tárolókból tudjuk megtenni, a következő utasítással:
svn co svn://svn.liferay.com/repos/public/portal/trunk --username guest
A kért jelszót hagyjuk üresen, és máris jön lefele a forrás. Ez eltart egy darabig, mivel elég nagy kódbázisról van szó. Ezután buildeljük le:
ant all
Ez létrehozza a szükséges könyvtárakat. Töltsünk egy Tomcat 6-ot, és tegyük be a most létrejött bundles/tomcat mappába. Telepítéshez újra buildeljünk:
ant all
Ezután ha elindíthatjuk, felállt a portál. Fontos, hogy minden buildnél le legyen állítva a Tomcat! Ha Exceptionökkel indul, mert nem sikerült a Lucene-nek lock-ot szereznie, akkor leállítás után töröljük le a data/lucene/0/write.lock fájlt!

Mivel szeretnénk IDE-vel fejleszteni, ezért Eclipse-ben importáljuk be a projectet, majd vegyük fela szerverek közé a Tomcat-et. Ezután duplaklikk a szerverre és áálítsuk át a Server location-t a 2. választási lehetőségre, és a Deploy path-ot webapps-ra! Ezután a run configuration-t megnyitva adjuk hozzá az argumentumlistához a -Dexternal-properties=portal-developer.properties -t!

Voilá, készen is vagyunk, van egy fejlesztőkörnyezetünk, amivel a Liferayt tudjuk fejleszteni.