Liferay Portal 6: Employ federated search, OpenSearch, CSZ search, maps search and web Content search

Exclusive offer: get 50% off this eBook here
Liferay Portal 6 Enterprise Intranets

Liferay Portal 6 Enterprise Intranets — Save 50%

Build and maintain impressive corporate intranets with Liferay

$35.99    $18.00
by Jonas X. Yuan | May 2010 | Enterprise Articles

In this article by Jonas X.Yuan, author of Liferay Portal 6 Enterprise Intranets, we will cover:

  • Employ federated search, OpenSearch, CSZ search, and maps search
  • Employ Web Content search

(Read more interesting articles on Liferay Portal 6 here.)

Federated search

Federated search is the simultaneous searching of multiple online databases or web resources, and it is an emerging feature of automated, web-based library, and information retrieval systems. Here, federated search refers to the portal. It is very useful to provide federated search abilities, such as searches for blog entries, users, organizations, Calendar entries, Bookmarks entries, Document Library documents, Image Gallery images, Message Boards messages, Wiki articles, Web Content articles, Directory, and so on. The portal provides a set of search portlets. In this section, we're going to take an in-depth look at these portlets.

The Search portlet

The Search portlet (portlet ID 3) is a JSR-286-compliant portlet that can be used for federated search. By default, the portal itself is the search provider. As shown in following screenshot, Search Portlet provides a federated search against Blogs entries, users, organizations, Calendar entries, Bookmarks entries, Document Library documents, Image Gallery images, Message Boards message, Wiki articles, Web Content articles, Directory, and so on. In addition, the Search Portlet provides a federated search against plugin portlets like the Alfresco Content portlet.

Liferay Portal 6: Employ federated search, OpenSearch, CSZ search, maps search and web Content search

The following is an example of how to use the Search portlet:

  • Add the Search portlet to the page Home of the community Guest where you want to carry out a search, if the Search portlet isn't already present
  • Enter the search criterion, for example My
  • Click on the Search icon

Note that when searching for assets, you will have the ability to specify the scope of the search results: Everything or This Community. Everything would generate search results that will come from any group in the current portal instance such as communities, organizations, and my community. This Community will generate search results that come from the current group in the portal instance such as community Guest, organization "Palm Tree Enterprise", and My Community.

The search results would cover Blogs entries, users, organizations, Calendar entries, Bookmarks entries, Document Library documents, Image Gallery images, Message Boards messages, Wiki articles, Web Content articles, Directory, and so on. Additionally, search results will include assets from plugin portlets like Alfresco Content portlet.

As you can see, search results would be displayed as a title with a link. If you have the proper permission on an asset, you could click on the title of the asset (which is a link to it) and view the asset as well. But if you don't have proper permission on an asset, clicking on the title would bring up a the permission error message.

What's happening?

The portal provides many portlets to support OpenSearch framework such as Message Boards, Blogs, Wikis, Directory and Document Library, Users, Organizations, and so on. In addition, plugins like the Alfresco Content portlet also supports the OpenSearch framework. Normally, these portlets have the following OpenSearch framework configuration.

 <open-search-class>class-name </open-search-class>

The Search portlet obtains an OpenSearch instance from each portlet that has the tag &ltopen-search-class> definition. For example, the portlet Directory (portlet ID 11) allows users to search for other users, organizations, or user groups. OpenSearch has been specified for the portlet Directory in $PORTAL_ROOT_HOME/WEB-INF/liferayportlet. xml as follows:

 <open-search-class>
com.liferay.portlet.directory.util.DirectoryOpenSearchImpl
</open-search-class>

As shown in the preceding code, the open-search-class value must be a class that implements com.liferay.portal.kernel.search.OpenSearch, which is called to get search results in the OpenSearch standard.Besides the OpenSearch framework, the portal provides UI taglib to display search results. In$PORTAL_ROOT_HOME/html/portlet/search/view.jsp, you could find the following code.

<liferay-ui:search />

For more details on UI taglib <liferay-ui:search>, you would check JSP files start.jsp and end.jsp under the folder $PORTAL_ROOT_HOME/html/taglib/ui/ search. In addition, the portal scopes OpenSearch results through the UI taglib <liferay-ui:search>. For example, the scope of search results, namely, Everything or This Community has been specified in $PORTAL_ROOT_HOME/html/taglib/ui/search/start.jsp as follows:

<select name="<%= namespace %>groupId">
<!-ignore details -->
<option value="<%= group.getGroupId() %>" <%= (groupId != 0) ?
"selected" : "" %>><liferay-ui:message key='<%= "this-" +
(group.isOrganization() ? "organization" : "community") %>' />
</option>
</select>

As you can see, the value of This Community would be an organization or community. By default, the OpenSearch implementation in the portal supports both formats: ATOM and RSS. The default format would be ATOM. Therefore, the search results from plugin portlets must be returned in the format ATOM. For example, in the portlet Alfresco Content, the format of search results must be ATOM. Why? The portlet Search has specified the following code in $PORTAL_ROOT_HOME/html/ portlet/search/open_search_description.jsp.

<OpenSearchDescription xmlns="http://a9.com/-/spec/OpenSearch/1.1/">
<!-ignore details --><Url type="application/rss+xml" template="<%=
themeDisplay.getPortalURL() %><%= PortalUtil.getPathMain() %>/
search/open_search?keywords={searchTerms}&amp p={startPage?}&amp
c={count?}&amp format=rss" />
</OpenSearchDescription>

In addition, search results are displayed in pagination through the search container. Fortunately, search container is configurable. The portal has specified the following properties in portal.properties.

search.container.page.delta.values=5,10,20,30,50,75
search.container.page.iterator.max.pages=25

As shown in the preceding code, the property search.container.page.delta. values sets the available values for the number of entries to be displayed per page. An empty value, or commenting out the value, will disable delta resizing. The default of 20 will apply in all cases. Note that you need to always include 20 because it is the default page size when no delta is specified. The absolute maximum allowed delta value is 200. The property search.container.page.iterator.max.pages sets the maximum number of pages, which are available before and / or after the currently displayed page. Of course, you could override these properties anytime in portal-ext.properties.

Configuration

As mentioned previously, OpenSearch in the Search portlet covers the in-and-out of Blogs, Calendar, Bookmarks, Document Library, Image Gallery, Message Boards, Wiki, Web Content, Directory, and so on. Fortunately, the portal adds the ability to remove these portlets from the list of portlets searched by the portlet Search as follows:

com.liferay.portlet.blogs.util.BlogsOpenSearchImpl=true
## ignore details
com.liferay.portlet.wiki.util.WikiOpenSearchImpl=true

As shown in the preceding code, you can set any of these properties to false to disable the portlet from being searched by the Search portlet in portal-ext.properties.

Customization

In real cases, you may be required to use the portlet Search in different ways. You would be able to customize the portlet Search. Here we're going to discuss how to use the Search portlet in Social Office and how to use the Search portlet in themes. The Social Office overrides the UI taglib <liferay-ui:search> in the portlet soportlet through JSP file hooks in $AS_WEB_APP_HOME/so-portlet/META-INF/ custom_jsps/html/taglib/ui/search/start.jsp as follows:

<liferay-util:include page="/html/taglib/ui/search/start.portal.jsp"
/>
<c:if test="<%= group.isUser() %>">
<script type="text/javascript">
var searchOptions = jQuery('select[name=<%= namespace %>
groupId] option')
searchOptions.each( //ignore details )
</script>
</c:if>

As shown in the preceding code, the Social Office overrides the look and feel of the portlet Search. For example, it will remove search options.

Of course, you can add the portlet Search as a runtime portlet in themes. You could add the Velocity template $theme.search() in the theme, specifically in the VM file portal_normal.vm or the VM file included in portal_normal.vm. For example,Social Office specified the following lines in the theme so-theme such as $AS_WEB_ APP_HOME/so-theme/templates/navigation_top.vm.

#if ($is_signed_in)
<div class="my-search">$theme.search()</div>
#end

As shown in the preceding code, when the user signs in, the Social Office will show the customized portlet Search in "my-search" style.

OpenSearch in plugins

In general, the portal provides an OpenSearch framework, so that a user can create an OpenSearch implementation in the plugin environment. The portal will try to call this OpenSearch implementation when you hit the Search portlet. The Search portlet goes through all registered implementations and tries to create an instance.

We could search content from the Alfresco repository, just as we did for Blogs, Bookmarks, Calendar, Directory, and so on via the OpenSearch framework of the portlet Search. How does it work?

How does it work?

First of all, we need to install the Alfresco Web Client, and then we need to deploy the portlet Alfresco Content. By following these three steps, you would bring the Alfresco Web Client into Tomcat as well:

  1. Download the latest Alfresco-Tomcat bundle from http://www.alfresco.com, and install it to the folder $ALFRESCO_HOME.
  2. Locate the Alfresco Web Client application alfresco.war under the folder $ALFRESCO_HOME, and drop it to the folder $TOMCAT_AS_DIR/webapps.
  3. Create a database alfresco in MySQL and restart Tomcat.
drop database if exists alfresco
create database alfresco character set utf8
grant all on alfresco.* to 'alfresco'@'localhost' identified by
'alfresco' with grant option
grant all on alfresco.* to 'alfresco'@'localhost.localdomain'
identified by 'alfresco' with grant option

Then we could deploy the plugin Alfresco Content portlet. The following is example of how to bring the portlet Alfresco Content into the portal.

  1. Download the WAR file ${alfresco.content.portlet.war} from http:// liferay.cignex.com/palm_tree/book/0387/chapter12/netvibeswidget- portlet-6.0.0.1.war.
  2. Drop the WAR file ${alfresco.content.portlet.war} to the folder$LIFERAY_HOME/deploy when the portal is running.

That's it! When you search for content again in the portlet Search, you will be able to see assets coming from the Alfresco Web Client. In addition, you would see a message like "Searched Alfresco Content, Blogs …" in the portlet Search.

Web services

As you can see, the Alfresco Content plugin displays content from the Alfresco repository. Two kinds of services are involved—web services and RESTful services. A web service is a software system designed to support interoperable machine-tomachine interaction over a network. With the portlet Alfresco Content, you could search or navigate content of the Alfresco repository via web services.

You have to simply go to More | Configuration | Setup | Current of the portlet Alfresco Content first. Then you should enter a User ID like "admin" and a password like "admin", and click on the Save button. Now, you will be able to see the root folder "Company Home".

The following property is specified in the portlet Alfresco Content:

$AS_WEB_APP_HOME/alfresco-content-portlet/WEB-INF/classes/portlet.
properties
content.server.url=http://localhost:8080

As shown in the preceding code, the property content.server.url sets the location of the Alfresco server URL.

RESTful services

Representational State Transfer (REST) is a style of software architecture for distributed hypermedia systems. Alfresco not only provides the ability to expose its search engines via OpenSearch, but it also provides an aggregate OpenSearch feature in the Alfresco Web Client through RESTful services. To summarize, Alfresco RESTful services-based keyword search mimics the keyword search of the Alfresco Web Client.

The following search URL template is used for OpenSearch in the plugin Alfresco Content.

http://<host>:<port>/alfresco/service/api/search/keyword.atom?q={searc
hTerms}&p={startPage?}&c={count?}&l={language?}

In the preceding code, the URL will have the following values:

  • searchTerms: The keyword or keywords to search
  • startPage (optional): The page number of search results desired by the client
  • count (optional): The number of search results per page (the default is 10)
  • language (optional): The locale to search with (XML 1.0 Language ID, for example en-GB)

Besides RESTful APIs for OpenSearch, Alfresco provides the following RESTful APIs built as Web Scripts:

  • Repository API Reference: Remote services for interacting with the Alfresco Repository
  • CMIS API Reference: Content Management Interoperability Services
  • Portlets such as My Inbox and My Checked-Out for hosting in any portal
  • Office Integration for hosting in Microsoft Office

Moreover, in order to allow the Alfresco Content portlet to support OpenSearch, the portlet has set the value open-search-class at $AS_WEB_APP_HOME/alfrescocontent-portlet/WEB-INF/liferay-portlet.xml as follows:

<open-search-class>
com.liferay.portlet.alfrescocontent.util.AlfrescoOpenSearchImpl
</open-search-class>

Finally, the portlet has set the following values in $AS_WEB_APP_HOME/alfrescocontent-portlet/WEB-INF/classes/portlet.properties, which will be used to query Alfresco via OpenSearch.

open.search.enabled=true
## ignore details open.search.path=/alfresco/service/api/search/
keyword.atom

Of course, you could override the preceding properties according to your own environment's, for example, server domain name, port number, search user name, search password, and so on.

CMIS

Besides web services and OpenSearch, Alfresco supports CMIS as well. Content Management Interoperability Services (CMIS) is a specification that defines how Enterprise Content Management (ECM) systems exchange content, defining a domain model and set of bindings, such as Web Service and RESTful Atom-Pub that can be used by applications to work with one or more content management repositories. Alfresco supports the CMIS REST API Binding, the CMIS web services API Binding, and Web Service WSDL.

The portal has specified the following properties for CMIS in portal.properties:

cmis.credentials.username=none
mis.credentials.password=none
cmis.repository.url=http://localhost:8080/alfresco/service/api/cmis
cmis.repository.version=1.0
cmis.system.root.dir=Liferay Home

As mentioned earlier, we could use CMIS hook to configure a repository. In addition, we could use these properties in the Alfresco Content portlet and provide OpenSearch capabilities based on CMIS.

Liferay Portal 6 Enterprise Intranets Build and maintain impressive corporate intranets with Liferay
Published: May 2010
eBook Price: $35.99
Book Price: $59.99
See more
Select your format and quantity:

(Read more interesting articles on Liferay Portal 6 here.)

CSZ Search

Let's say that we know the city name "Mountain View" and the state name "California" in USA and we want to find the related zip code. The CSZ search portlet would be useful for this requirement. Let's do it as follows.

  1. Install the portlet CSZ, and then add the CSZ Search portlet in the page "Home" of the community Guest where you want to search based on CSZ, if the CSZ Search portlet isn't there.
  2. First enter the city name as "Mountain View" and the state name as "California".
  3. Then click on Search button, and the zip code associated with the preceding given city and state will appear.
  4. Optionally, you may enter the zip code first, then click on the Search button, and the city and state pairs, associated with the given zip code, will appear.

The following screenshot depicts the CSZ Search example and the respective search results. It shows all related zip code values for the city name Mountain View and the state name California in USA.

Liferay Portal 6: Employ federated search, OpenSearch, CSZ search, maps search and web Content search

How does it work?

The following is an example of how to bring the portlet CSZ Search into the portal.

  • Download the WAR file ${csz.search.portlet.war} from http://liferay.cignex.com/palm_tree/book/0387/chapter12/csz-search-portlet-6.0.0.1.war
  • Drop the WAR file ${csz.search.portlet.war} to the folder $LIFERAY_HOME/deploy when the portal is running

What's happening?

In general, the CSZ (city, state, and zip)Search portlet provides a way to search for the zip code using the address, city, and state. Conversely, it also allows you to search for a city and state by zip code. A USPS ZIP code lookup is used as a web service provider.

USPS (U.S. Postal Service) provides services for ZIP code lookup.Check the following link for more information: www.usps.com/zip4/

Maps search

If we know the city name "Mountain View" and state name "California" in USA and we want to find related maps, the Maps Search portlet would be useful for this purpose. To use it, follow these steps:

  1. Install the portal Maps Search and then add the Maps Search portlet in the page "Home" of the community Guest where you want to search for maps, if the Maps portlet isn't already there.
  2. First enter the address city name "Mountain View", state "California", zip code, and country name "USA.
  3. Then click on the Search button.

A map associated with the given address, city, state, zip code, and country will appear, as shown in the following screenshot:

Liferay Portal 6: Employ federated search, OpenSearch, CSZ search, maps search and web Content search

How does it work?

The following is an example of how to bring the portlet Maps Search into the portal.

  • Download the WAR file ${maps.search.portlet.war} from: http://liferay.cignex.com/palm_tree/book/0387/chapter12/maps-searchportlet-6.0.0.1.war
  • Drop the WAR file${maps.search.portlet.war}to the folder $LIFERAY_HOME/deploywhen the portal is running.

What's happening?

The following properties are specified in the portlet Maps Search in$AS_WEB_APP_HOME/maps-search-portlet/WEB-INF/classes/portlet.properties:

map.google.maps.api.key=ABQIAAAAVUlXDwsmwMn1hOVRL9PRThTWJHub0YR0Jk5J
LS-JSo2KSqAp1BS26tv54N3FLvxz-mCy-TtY-iQwQg
map.google.maps.height=250
map.input.enabled=false
map.directions.input.enabled=false
map.default.address=Mountain View, CA 94040
map.default.directions.address=Mountain View, CA 94040

As shown in the preceding code, you can configure the properties map.google.maps.api.key, map.google.maps.height, map.input.enabled, map.directions. input.enabled, map.default.address, and map.default.directions.address,and override the preceding properties as well.

Additionally, the portlet Maps Search is configurable. You can navigate to the JSP file $AS_WEB_APP_HOME/maps-search-portlet/view.jsp with JavaScript code, and go further by updating the JSP file and JavaScript code inside.

In short, the Maps portlet provides the ability to find maps by address, city, state, zip code, and country. Google Maps is used as a web service provider.

Google Maps is a basic web-mapping service application. Refer to http://maps.google.com/ for more information.

What's OpenSearch?

As previously stated, we use OpenSearch to integrate Alfresco content in the Alfresco Content portlet. We will now see what's OpenSearch and why OpenSearch.

OpenSearch is a collection of simple formats in order to share search results. Generally speaking, OpenSearch allows publishing of search results in a format for syndication and aggregation. It is a useful way for both websites and search engines to publish search results in a standard and accessible format.

Design principles

OpenSearch consists of the following elements:

  • Description:XML files that identify and describe a search engine.
  • Query Syntax:This describes from where to retrieve the search results.
  • RSS or Response:Format for providing OpenSearch results.
  • Aggregators:Sites that can display OpenSearch results.
  • Auto-discovery:This will signal the presence of a search plugin link to the user and the link embedded in the header of the HTML pages.

 

OpenSearch description lists search results or responses for the given website. It provides support for multiple responses in any format. General speaking, RSS and Atom are the only elements formally supported by OpenSearch aggregators, however, other types, such as HTML, are perfectly acceptable.

OpenSearch specification

The OpenSearch description document defines three kinds of elements in general—the OpenSearch Query element, the OpenSearch URL template syntax, and the OpenSearch Response element.

OpenSearch description documents are referred to through the type: application/OpenSearchdescription+xml. The XML Namespaces URI for the XML data formats described in this specification, by default,is http://a9.com/-/spec/OpenSearch/1.1/

An example of a simple OpenSearch description document is shown as follows:

Element name

Description

OpenSearchDescription The root node of the OpenSearch description document
ShortName Contains a brief human-readable title that identifies this search
Description Contains a human-readable text description of the search engine
URL Describes an interface by which a search client can make search requests to the search engine
Contact Contains an e-mail address at which the maintainer of the description document can be reached
Tags Contains a set of words that are used as keywords to identify and categorize this search content
LongName Contains an extended human-readable title that identifies this search engine
Image Contains an image that identifies this search engine
Query Defines a search query that can be performed by search clients
Developer Contains the human-readable name or identifier of the creator or maintainer of the description document
Attribution Contains a list of all sources or entities that should be credited for the content contained in the search feed
SyndicationRight Contains a value that indicates the degree to which the search results provided by this search engine can be queried, displayed, and redistributed
AdultContent Contains a Boolean value that should be set to true if the search results contain material intended only for adults
Language Contains a string that indicates that the search engine supports search results in the specified language
InputEncoding Contains a string that indicates that the search engine supports search requests encoded with the specified character encoding
OutputEncoding Contains a string that indicates that the search engine supports search responses encoded with the specified character encoding

Web Content Search

The portlet Web Content Search (portlet ID 77) displays a textbox, which allows end users to search for all the Web Content of a website. Note that the portlet doesn't search for any other content types such as blogs, message board entries, wiki, and so on. So this portlet should mainly be used for a website, where the main content is web content.

In the intranet bookpub.com, you will have a lot of web content sooner or later. In order to manage this web content easily, search functionalities become very important. Fortunately, the portlet Web Content Search provides the ability to search for web content by types in a website. Let's have a deep look at the portlet Web Content Search by following these steps:

  1. Add the Web Content Search portlet to the page "Home" of the community Guest, where you want to search for web content, if the Web Content Search portlet isn't already there.
  2. First enter keywords as search criterion, for example, "test".
  3. Then click on the Search icon, as shown in the following screenshot.

Liferay Portal 6: Employ federated search, OpenSearch, CSZ search, maps search and web Content search

The portlet Web Content Search will search for web content published by the portlet Web Content Display (portlet ID 56) in the current group, say the community Guest. The search results will be displayed with columns such as number (marked as #),Name (the title of web content),Content (the web content and a link to the page where the web content got published through the Web Content Display portlet), and Score(relevance in five-star style). As you can see, pagination of the search container is also supported.

Setup

It is simple to configure the Web Content Search portlet. If we need to search for web content against the typeGeneral then we could do it by following these steps:

  1. Click on the More | Configuration | Setup | Current icon on the upperright of the portlet.
  2. With the Setup and the Current tabs selected, there is the Web Content type list. You can select the Web Content type, say General, which you would like to limit the search to.
  3. Select the checkbox, that is, "Only show results for web content listed in a Web Content Display portlet", if you want to show only search results for web content listed in the portlet Web Content Display.
  4. Input a value for Target Portlet ID, if required.
  5. Then click on the Save button to save the changes.
  6. If required, click on the arrow icon Return to Full Page to return.

There are several web content types by default—announcements, blogs, news, general, press release, and test. As mentioned earlier, these web content types are conf gurable through the property journal.article.types in portal.propertiesas follows:

journal.article.types=announcements,blogs,general,news,
press-release,test

Note that if there is no type selected, the portlet Web Content Search will search any articles (that is, web content) against any type.

You can also change permissions of the Web Content Search portlet. You can simply click on the More | Configuration | Permissions tab. You could update permission actions such as View, Add to Page, and Configuration by roles. Optionally, you can set up features of exporting and importing.

What's happening?

As you can see, the portal only shows search results for web content listed in a Web Content Display portlet. In general, the portlet Web Content Search searches for web content in the current community or organization and filters content searched by type of web content. Moreover, it specifies a target portlet, the location where the web content will be displayed, and when its link will be clicked in a search results list.

Configuration

The portal has specified the following property for the portlet Web Content Search in portal.properties.

journal.content.search.show.listed=true

As shown in the preceding code, the property journal.content.search.show. listed sets whether unlisted articles are excluded from search results. By default, unlisted articles are excluded from search results.

In real cases, you may need to apply the portlet Web Content Search to all pages of a website. Therefore, you could add the portlet Web Content Search for themes. To achieve this, you simply need to add the Velocity template $theme. journalContentSearch()in the theme, specifically in the VM file portal_normal. vm or the VM file included inportal_normal.vm.For example, you can replace the portlet Search with the portlet Web Content Search in Social Office, the themesothemesuch as $AS_WEB_APP_HOME/so-theme/templates/navigation_top.vm.

#if ($is_signed_in)
<div class="my-search">$theme.journalContentSearch()</div>
#en

As shown in the preceding code, when the user signs in, the Social Office will show the customized portlet Web Content Search in the "my-search" style instead of the portlet Search.

Lucene search engine

This portal provides search capabilities to search for web content in any website. The portlet Web Content Search, by default, is powered by the Apache Lucene search engine.

Apache Lucene acts as a high-performance and full-featured text search engine. It is suitable for almost any application that requires full-textsearch, especially cross-platform applications. Refer to http://lucene.apache.org/ to know more about it.

In general, the Apache Lucene search engine has many useful features such as Ranked searching—here, best results are returned first. This includes many powerful query types—phrase queries, wildcard queries, proximity queries, range queries, and more.

It also allows fielded searching (for example, title, author, contents), date-range searching, sorting by any field, multiple-index searching with merged results, and simultaneous update and searching.

There's more

In this article of the three part series, we have covered Employ federated search, OpenSearch, CSZ search, maps search and Web Content search.

In the coming article, we will cover Configure sitemap for search engines and pluggable enterprise search, Manage plugins , Build WAP sites,Report and Audit,Integrate with CRM and Netvibes widgets


If you have read this article you may be interested to view :


About the Author :


Jonas X. Yuan

Jonas X. Yuan is a Chief Architect of ForgeLife LLC and an expert on Liferay Portal, e-commerce, and Content Management Systems (CMS). As an open source community contributor, he has published five Liferay books from 2008 to 2012. He is also an expert on Liferay integration with Ad Server OpenX, different search engines, enterprise content including videos, audio, images, documents, and web contents, and other technologies, such as BPM Intalio and Business Intelligence Pentaho, LDAP, and SSO. He holds a Ph.D. in Computer Science from the University of Zurich, where he focused on Integrity Control in federated database systems.

He earned his M.S. and B.S. degrees from China, where he conducted research on expert systems for predicting landslides. Previously, he worked as a Project Manager and a Technical Architect in Web GIS (Geographic Information System).
He is experienced in Systems Development Lifecycle (SDLC) and has deep, hands-on skills in J2EE technologies. He developed a BPEL (Business Process Execution Language) engine called BPELPower from scratch at the NASA data center. As the chief architect, Dr. Yuan successfully led and launched several large-scale Liferay/Alfresco e-commerce projects for millions of users each month.

He has worked on the following books: Liferay Portal Enterprise Intranets, 2008; Liferay Portal 5.2 Systems Development, 2009; Liferay Portal 6 Enterprise Intranets, 2010; Liferay User Interface Development, 2010; Liferay Portal Systems Development, 2012.

Books From Packt

Drupal 6 Social Networking
Drupal 6 Social Networking

Alfresco Developer Guide
Alfresco Developer Guide

Learning Joomla! 1.5 Extension Development
Learning Joomla! 1.5 Extension Development

Joomla! Web Security
Joomla! Web Security

OpenCms 7 Development
OpenCms 7 Development

WordPress Plug-in Development (Beginner's Guide)
WordPress Plug-in Development (Beginner's Guide)

Apache OFBiz Development: The Beginner's Tutorial
Apache OFBiz Development: The Beginner's Tutorial

Drupal for Education and E-Learning
Drupal for Education and E-Learning

Code Download and Errata
Packt Anytime, Anywhere
Register Books
Print Upgrades
eBook Downloads
Video Support
Contact Us
Awards Voting Nominations Previous Winners
Judges Open Source CMS Hall Of Fame CMS Most Promising Open Source Project Open Source E-Commerce Applications Open Source JavaScript Library Open Source Graphics Software
Resources
Open Source CMS Hall Of Fame CMS Most Promising Open Source Project Open Source E-Commerce Applications Open Source JavaScript Library Open Source Graphics Software