<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Jonas Yuan</title>
  <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/rss" />
  <subtitle>Jonas Yuan</subtitle>
  <entry>
    <title>Assets remote publishing enhancement in Liferay portal</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/assets-remote-publishing-enhancement-in-liferay-portal" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/assets-remote-publishing-enhancement-in-liferay-portal</id>
    <updated>2012-01-04T00:58:11Z</updated>
    <published>2011-12-27T23:11:06Z</published>
    <summary type="html">&lt;p&gt;
	The portal provides remote staging and publishing capability through which the users can select subsets of pages and data, and transfer them to the live site of the remote portal instance. By this feature, we can export the selected data to the group of a remote portal instance or to another group in the same portal instance. The LAR export and import features are used for remote staging and publishing. These features are implemented in the PortletDataHandler API. As mentioned earlier, the intent of this API is to import and export application content to and from the portal in a database agnostic fashion for the portal core assets and custom assets.&lt;/p&gt;
&lt;p&gt;
	The following diagram depicts an overview of remote staging and remote publishing. The Staging has a set of portal core assets, custom assets and groups of users. First, the portal will export related portal core assets and custom assets based on current user’s permission as a LAR zip file. And then the portal transfers this LAR zip file to the Live through tunnel-web http or https call. The Live will import related portal core assets and custom assets, as a LAR zip file, based on same user’s permission.&lt;br /&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f2e1db10-8784-4b5e-b7ec-7dc86b1807ba&amp;amp;groupId=31578&amp;amp;t=1325027156790" style="width: 660px; height: 161px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Abstracted from the Liferay development cookbook: &lt;a href="http://www.packtpub.com/liferay-portal-systems-development/book"&gt;&lt;strong&gt;Liferay Portal Systems Development&lt;/strong&gt;&lt;/a&gt; (for liferay portal 6.1 or above version)&lt;/p&gt;
&lt;p&gt;
	The staging and publishing are based on a page (a set of portlets).&amp;nbsp; Portlets that are check-marked will be Staged called staged portlets. This means that their data is published automatically whenever a page containing them is published.&amp;nbsp; The following is a list of staged portlets:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Blogs (*)&lt;/li&gt;
	&lt;li&gt;
		Bookmarks (*)&lt;/li&gt;
	&lt;li&gt;
		Calendar (*)&lt;/li&gt;
	&lt;li&gt;
		Documents and Media (*)&lt;/li&gt;
	&lt;li&gt;
		Documents and Media Display&lt;/li&gt;
	&lt;li&gt;
		Dynamic Data Mapping (*)&lt;/li&gt;
	&lt;li&gt;
		Knowledge Base (Admin) (*) - or any custom plugins which have LAR import and export configuration.&lt;/li&gt;
	&lt;li&gt;
		Message Boards (*)&lt;/li&gt;
	&lt;li&gt;
		OpenSocial Gadget Publisher&lt;/li&gt;
	&lt;li&gt;
		Page Comments&lt;/li&gt;
	&lt;li&gt;
		Page Ratings&lt;/li&gt;
	&lt;li&gt;
		Polls (*)&lt;/li&gt;
	&lt;li&gt;
		Polls Display&lt;/li&gt;
	&lt;li&gt;
		RSS&lt;/li&gt;
	&lt;li&gt;
		WSRP (*)&lt;/li&gt;
	&lt;li&gt;
		Web Content (*)&lt;/li&gt;
	&lt;li&gt;
		Web Content Display (*)&lt;/li&gt;
	&lt;li&gt;
		Wiki&lt;/li&gt;
	&lt;li&gt;
		Wiki Display&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	These portlets which are disabled and check-marked are always automatically exported even if they aren’t on the page. These which are disabled and not check-marked are never automatically published. Note that Collaboration portlets, such as Blogs, Message Boards and Wiki are excluded from being Staged by default as their data typically originates in Live.&lt;/p&gt;
&lt;p&gt;
	As you can see, the staging and publishing capabilities are portlet-based. If the staged portlet contains one asset, that asset will get published. For example, the portlet Web Content Display portlet can display web content a time.&amp;nbsp; If the staged portlet contain many assets, these assets will get published, filtered by the the range (like &lt;em&gt;All, From Last Publish Date, Date Range, Last&lt;/em&gt;, etc).. But in real cases, it would be nice to have a feature to remotely publish assets directly in asset-level.&lt;/p&gt;
&lt;p&gt;
	This article will address following remote publishing enhancement.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Add asset-level remote-publishing capability&amp;nbsp; (&lt;a href="http://issues.liferay.com/browse/LPS-17235"&gt;LPS-17235&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;
		keep the category UID same AS IS when importing or remote publishing (&lt;a href="http://issues.liferay.com/browse/LPS-22092"&gt;LPS-22092&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;
		Keep asset UID same AS IS when importing or remote publishing (&lt;a href="http://issues.liferay.com/browse/LPS-17550"&gt;LPS-17550&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Asset-level remote-publishing&lt;/h2&gt;
&lt;p&gt;
	Currently remote publishing feature is page-based. It would be nice to have a feature to remotely publish assets directly in asset-level. In fact, it would be cool that remote-publishing feature would support both layout-level and asset-level scheduling and publishing.&lt;/p&gt;
&lt;p&gt;
	Use case&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		create a web content articles A1, A2 and A3 by user A and / or User B&lt;/li&gt;
	&lt;li&gt;
		schedule to publish A1 immediately by user A&lt;/li&gt;
	&lt;li&gt;
		chedule to publish A2 in 10 min by user A&lt;/li&gt;
	&lt;li&gt;
		schedule to publish A1 in 30 min by user B&lt;/li&gt;
	&lt;li&gt;
		schedule to publish A3 in 60 min by user B&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	This feature could be implemented by a plugin – called asset-remote-publish-portlet.&lt;/p&gt;
&lt;p&gt;
	List screenshots of the plugin implementation&lt;/p&gt;
&lt;p&gt;
	Assets creation, using web content as an example&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=e61cccc3-ae34-40e8-a2d9-5fc1b9a54ff7&amp;amp;groupId=31578&amp;amp;t=1325349419983" style="width: 660px; height: 341px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Assets selection&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f7c423c9-92a8-4f9c-9486-300891cdfe97&amp;amp;groupId=31578&amp;amp;t=1325349419984" style="width: 660px; height: 370px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Remote publishing settings - reuse default portal settings&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=cd4af3b6-d77d-4861-839a-92ea12c075be&amp;amp;groupId=31578&amp;amp;t=1325349926616" style="width: 660px; height: 278px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Publish selected assets - from the Stage to the Live&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=7b80371e-7f35-451d-8972-8589d6693b4d&amp;amp;groupId=31578&amp;amp;t=1325349419986" style="width: 660px; height: 150px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	As you can see, you can publish one or many assets one time based on selection.&lt;/p&gt;
&lt;h2&gt;
	Keeping the category UID same AS IS&lt;/h2&gt;
&lt;p&gt;
	This feature (keeping the category UID same AS IS when importing or remote publishing) should be available for vocabularies, categories and tags.&lt;/p&gt;
&lt;p&gt;
	Use case:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		There are two environments - the stage and the remote Live.&lt;/li&gt;
	&lt;li&gt;
		In the stage, create Journal Article A1 (C11) and B1 (with categories C22). And C11 and C22 are same level categories (siblings) of the vocabulary V1.&lt;/li&gt;
	&lt;li&gt;
		Push the article A1 and B1 to the remote Live. The remote Live should have V1, C11 and C22. Both C11 and C22 belong to the Vocabulary V1, and C11 and C22 are siblings.&lt;/li&gt;
	&lt;li&gt;
		In the Stage, update C11 and C22, let C22 becomes child category of the C11.&lt;/li&gt;
	&lt;li&gt;
		Push the article A1 and B1 to the remote Live. The remote Live should have V1, C11 and C22. Both C11 and C22 belong to the Vocabulary V1, and C22 should be the child of C11. No new categories related to C11 and C22 should be created, and relationship of C11 and C22 should be updated automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Implementation:&lt;/p&gt;
&lt;p&gt;
	when exporting / importing categories, keep the category UID (and vocabulary UID) same AS IS.&lt;/p&gt;
&lt;h2&gt;
	Keeping asset UID same AS IS&lt;/h2&gt;
&lt;p&gt;
	This feature (keeping asset UID same AS IS when importing or remote publishing) should be available for any asset (core asset like Document and Media Library document, Web Content artcile, or custom asset like Knowledge Base article) which has UID field.&lt;/p&gt;
&lt;p&gt;
	Scenario I:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		There are two environments – the stage and the Live.&lt;/li&gt;
	&lt;li&gt;
		In the stage, create Journal Article A1 and B1, and B1 is associated to A1 - Apply className-classPK pattern to JournalArticle.&lt;/li&gt;
	&lt;li&gt;
		publish A1 and B1 from the Stage to the Live
		&lt;ul&gt;
			&lt;li&gt;
				A1 UID and B1 UID should be maintained same in the Live as that of the Stage&lt;/li&gt;
			&lt;li&gt;
				Association of A1 and B1 should be maintained same in the Live as that of the Stage&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Scenario II:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		An editorial prepares release article with friendly URL &lt;strong&gt;&lt;em&gt;http://${stage.domain.name}/release/${uid}/${article.title}&lt;/em&gt;&lt;/strong&gt; in the Stage&lt;/li&gt;
	&lt;li&gt;
		Before remote-publishing the release, he / she sends the release with expected friendly URL &lt;strong&gt;&lt;em&gt;http://${live.domain.name}/release/${uid}/${article.title}&lt;/em&gt;&lt;/strong&gt; to the mail-list&lt;/li&gt;
	&lt;li&gt;
		Once remote-published the release, everyone should get the same URL for the release: &lt;strong&gt;&lt;em&gt;http://${live.domain.name}/release/${uid}/${article.title}&lt;/em&gt;&lt;/strong&gt;, for example, &lt;em&gt;&lt;a href="http://lnkd.in/KqCKDx"&gt;/feature/626347/2011-Year-in-Review-Collaboration&lt;/a&gt;; &lt;/em&gt;&lt;a href="http://lnkd.in/hFzmX3"&gt;/feature/626323/2011-Year-in-Review-Core-Networks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Implementation:&lt;/p&gt;
&lt;p&gt;
	When exporting / importing assets, keep the asset UID same AS IS.&lt;/p&gt;
&lt;h2&gt;
	More expected staging and publishing features&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;
		WCM Staging: Synchronize Comments with production (&lt;span id="similarIssuesBlock" style=""&gt;&lt;a href="http://issues.liferay.com/browse/LPS-11213"&gt;LPS-11213&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;
		WCM Staging - UX Check boxes remain checked when publishing to Live after subsequent visits (&lt;span id="similarIssuesBlock" style=""&gt;&lt;a href="http://issues.liferay.com/browse/LPS-12392"&gt;LPS-12392&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;
		WCM Publishing - Option to disable approval process for articles (&lt;span id="similarIssuesBlock" style=""&gt;&lt;a href="http://issues.liferay.com/browse/LPS-10456"&gt;LPS-10456&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;
		WCM Video Publishing - Embedding on Asset Creation and Linking (&lt;span id="similarIssuesBlock" style=""&gt;&lt;a href="http://issues.liferay.com/browse/LPS-13683"&gt;LPS-13683&lt;/a&gt;&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;
		WCM Staging - Version/Reversions Publishing and Point in Time Previews (&lt;a href="http://issues.liferay.com/browse/LPS-13562" id="key-val" rel="49724"&gt;LPS-13562&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;
		Ability to remotely publish assets based on versions (&lt;a href="http://issues.liferay.com/browse/LPS-17395" id="key-val" rel="58442"&gt;LPS-17395&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Download URLs&lt;/h2&gt;
&lt;p&gt;
	&lt;a href="http://www.liferay.com/documents/31578/d33ac938-5e34-4b40-b546-eec204f5bd95"&gt;6.0.12&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	6.1 CE&lt;br /&gt;
	&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-12-27T23:11:06Z</dc:date>
  </entry>
  <entry>
    <title>Indexer post processor hook in Liferay 6.1</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/indexer-post-processor-hook-in-liferay-6-1" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/indexer-post-processor-hook-in-liferay-6-1</id>
    <updated>2011-11-30T20:31:11Z</updated>
    <published>2011-11-30T19:14:57Z</published>
    <summary type="html">&lt;p&gt;
	Hooks are a feature to catch hold of the properties and JSP files into an instance of the portal, as if catching them with a hook. Hook plugins are more powerful plugins that come to complement portlets, themes, layout templates, and web modules. A hook plugin can, but does not have to, be combined with a portlet plugin or a web plugin. For instance, the portlet called so-portlet is a portlet plugin for Social Office with hooks; a hook plugin can simply provide translation or override JSP page. In general, hooks would be very helpful tool to customize the portal without touching the code part of the portal, as shown in the following diagram. In addition, you could use hooks to provide patches for portal systems or social office products.&lt;/p&gt;
&lt;p&gt;
	In general, there are several kinds of hook parameters in order:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		&lt;strong&gt;portal-properties&lt;/strong&gt; (called portal properties hooks),&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;language-properties&lt;/strong&gt; (called language properties hooks),&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;custom-jsp-dir&lt;/strong&gt; (called custom JSPs hooks),&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;custom-jsp-global&lt;/strong&gt; (applying custom JSPs hooks globally or locally),&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;indexer post processors&lt;/strong&gt; (called indexer hook),&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;service&lt;/strong&gt; (called portal service hooks) – including model listeners and service wrappers,&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;servlet-filter and servlet-filter-mapping&lt;/strong&gt; (called servlet-filter hooks),&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;struts-action&lt;/strong&gt; (called &lt;a href="http://www.liferay.com/web/mika.koivisto/blog/-/blogs/7132115"&gt;portal struts action hooks&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	As you can see, JSPs hooks can set a custom-jsp-dir that will overwrite portal JSPs. You can also add &lt;em&gt;&amp;lt;custom-jsp-global&amp;gt;false&amp;lt;/custom-jsp-global&amp;gt;&lt;/em&gt; (default to true) so that JSPs hooks will not apply globally but only to the current scope. Each site (or organization) can choose to have that hook apply just for that site (or organization).&lt;/p&gt;
&lt;p&gt;
	In addition, Liferay allows portal JSPs to be overloaded by theme templates – this pattern will require that within the theme's templates folder the complete path to the original JSP be maintained with the file extension replaced to match that of the theme's chosen template language.&lt;/p&gt;
&lt;p&gt;
	Abstracted from the Liferay development cookbook: &lt;a href="http://www.packtpub.com/liferay-portal-systems-development/book"&gt;&lt;strong&gt;Liferay Portal Systems Development&lt;/strong&gt;&lt;/a&gt; (for liferay portal 6.1 or above version)&lt;/p&gt;
&lt;p&gt;
	The indexer hook allows building a post processing system on top of the existing indexer, therefore plugin hook developers could be able to modify the search summaries, indexes, and queries. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-15811"&gt;LPS-15811&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	This article will show how to build &lt;strong&gt;sample indexer post processor hook&lt;/strong&gt;. Let’s consider use case. As you know, the version 6.1 adds a lot of CMS (&lt;strong&gt;Documents and Media&lt;/strong&gt;) &lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/auditing-document-downloads-via-document-library-record-plugin"&gt;features&lt;/a&gt; like&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Capability to manage different document types: basic document, image (Image Gallery is merged into Document Library), video, audio, etc.&lt;/li&gt;
	&lt;li&gt;
		Providing Dynamic Data List (DDL) and Dynamic Data Mapping (DDM) - see blogs &lt;a href="../marcellus.tavares/blog/-/blogs/dynamic-data-lists-i"&gt;Dynamic Data Lists I&lt;/a&gt; and &lt;a href="../marcellus.tavares/blog/-/blogs/dynamic-data-lists-ii"&gt;Dynamic Data Lists II&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	For the document type “Image”, we are going to add searchable keyword “Image”; while for the document type “Video”, we are going to add searchable keyword “Video”. Thus whenever you search by keyword “Image” or “Video”, you would be able to find out documents from document type “Image” or “Video”.&lt;/p&gt;
&lt;h2&gt;
	Implementation&lt;/h2&gt;
&lt;p&gt;
	You can build sample indexer post processor hook plugin in following steps.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Create a hook project, for example, sample-indexer-post-processor-hook&lt;/li&gt;
	&lt;li&gt;
		In liferay-hook.xml, add following lines&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;
	&amp;lt;!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"&amp;gt;&lt;br /&gt;
	&amp;lt;hook&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;portal-properties&amp;gt;portal.properties&amp;lt;/portal-properties&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;indexer-post-processor&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;indexer-class-name&amp;gt;com.liferay.portlet.documentlibrary.model.DLFileEntry&amp;lt;/indexer-class-name&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;indexer-post-processor-impl&amp;gt;com.liferay.hook.indexer.SampleIndexerPostProcessor&amp;lt;/indexer-post-processor-impl&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/indexer-post-processor&amp;gt;&lt;br /&gt;
	&amp;lt;/hook&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	As you can see, you can set &lt;strong&gt;indexer-class-name&lt;/strong&gt; as a model entity like &lt;strong&gt;DLFileEntry&lt;/strong&gt;: &lt;em&gt;com.liferay.portlet.documentlibrary.model.DLFileEntry&lt;/em&gt;; and set the &lt;strong&gt;indexer-post-processor-impl&lt;/strong&gt; as &lt;em&gt;com.liferay.hook.indexer.SampleIndexerPostProcessor&lt;/em&gt;, which must implement the interface &lt;em&gt;com.liferay.portal.kernel.search.IndexerPostProcessor&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		In web.xml, add following lines&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;display-name&amp;gt;sample-indexer-post-processor-hook&amp;lt;/display-name&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;listener-class&amp;gt;com.liferay.portal.kernel.servlet.SerializableSessionAttributeListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/listener&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;listener-class&amp;gt;com.liferay.portal.kernel.servlet.HookContextListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/listener&amp;gt;&lt;br /&gt;
	&amp;lt;/web-app&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Create sample indexer post processor class: &lt;em&gt;com.liferay.hook.indexer.SampleIndexerPostProcessor&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;public class SampleIndexerPostProcessor implements IndexerPostProcessor&lt;br /&gt;
	{&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;public void postProcessContextQuery(BooleanQuery arg0, SearchContext arg1)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throws Exception {&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(_log.isDebugEnabled())&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_log.debug("called postProcessContextQuery()");&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;public void postProcessDocument(Document document, Object object)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throws Exception {&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;DLFileEntry dLFileEntry = (DLFileEntry) object;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(_log.isDebugEnabled())&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_log.debug("called postProcessDocument(): uuid=" + dLFileEntry.getUuid() +&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;" title=" + dLFileEntry.getTitle() +&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;" dLFileEntryId=" + dLFileEntry.getFileEntryId());&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;String text = "";&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;try {&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;long fileEntryTypeId = dLFileEntry.getFileEntryTypeId();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;DLFileEntryType dLFileEntryType = DLFileEntryTypeLocalServiceUtil.getDLFileEntryType(fileEntryTypeId);&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // add your logic here&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;text = dLFileEntryType.getName();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} catch (Exception e) {}&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(text.length() &amp;gt; 0)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;document.addText(Field.URL, text);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;public void postProcessFullQuery(BooleanQuery arg0, SearchContext arg1)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throws Exception {&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(_log.isDebugEnabled())&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_log.debug("called postProcessFullQuery()");&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;public void postProcessSearchQuery(BooleanQuery arg0, SearchContext arg1)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throws Exception {&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(_log.isDebugEnabled())&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_log.debug("called postProcessSearchQuery()");&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;public void postProcessSummary(Summary arg0, Document arg1, Locale arg2,&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;String arg3, PortletURL arg4) {&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(_log.isDebugEnabled())&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;_log.debug("postProcessSummary()");&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;private static Log _log = LogFactoryUtil.getLog(SampleIndexerPostProcessor.class);&lt;br /&gt;
	}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	As shown in the above code, you would be able to add your own logic for summary, search query, context query and document. That’s it.&lt;/p&gt;
&lt;h2&gt;
	Results&lt;/h2&gt;
&lt;p&gt;
	search by keyword "Image"&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f3db0ee6-0ca3-431d-87f6-d4b4400a6a47&amp;amp;groupId=31578&amp;amp;t=1322682147293" style="width: 660px; height: 242px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Search by keyword "Video"&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=7b86d439-3e09-4316-9aaa-0b4e49980005&amp;amp;groupId=31578&amp;amp;t=1322682147272" style="width: 660px; height: 239px;" /&gt;&lt;/p&gt;
&lt;h2&gt;
	Download URL&lt;/h2&gt;
&lt;p&gt;
	&lt;a href="http://www.liferay.com/documents/31578/11633350/sample-indexer-post-processor-hook-6.1.0.1.war"&gt;Sample indexer post processor hook Liferay 6.1&lt;/a&gt; with source code.&lt;/p&gt;
&lt;h2&gt;
	What’s next?&lt;/h2&gt;
&lt;p&gt;
	The next post would be: &lt;em&gt;sample servlet-filter and servlet-filter-mapping hook in Liferay 6.1&lt;/em&gt;.&lt;br /&gt;
	&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-11-30T19:14:57Z</dc:date>
  </entry>
  <entry>
    <title>Liferay development cookbook: Liferay Portal Systems Development</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/liferay-development-cookbook:-liferay-portal-systems-development" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/liferay-development-cookbook:-liferay-portal-systems-development</id>
    <updated>2011-12-01T18:12:36Z</updated>
    <published>2011-11-12T19:27:44Z</published>
    <summary type="html">&lt;h1&gt;
	&lt;span style="font-size:24px;"&gt;&lt;a href="http://www.packtpub.com/liferay-portal-systems-development/book"&gt;Liferay Portal Systems Development &lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=6c32dabe-d047-45fa-be5b-61a5ed292d32&amp;amp;groupId=31578&amp;amp;t=1321125801470" style="width: 160px; height: 198px; float: right;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;
	&lt;strong&gt;&lt;span style="font-size:14px;"&gt;Build dynamic, content-rich and social systems on top of Liferay&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Use Liferay tools (CMS, WCM, collaborative API and social API) to create your own Web sites and WAP sites with hands-on examples&lt;/li&gt;
	&lt;li&gt;
		Customize Liferay portal using the JSR-286 portlets, hooks, ext plugins, themes, layout templates, webs plugins and diverse portlet bridges&lt;/li&gt;
	&lt;li&gt;
		Build your own web sites with kernel features like indexing, workflow, staging, scheduling, messaging, polling, tracking, auditing, reporting and more&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	In Detail&lt;/h2&gt;
&lt;p&gt;
	Liferay portal is one of the most mature portal frameworks in the market, offering many key business benefits that involve personalization, customization, content management systems, web content management, collaboration, social networking and workflow. If you are a Java developer who wants to build custom web sites and WAP sites using Liferay portal, this book is all you need.&lt;/p&gt;
&lt;p&gt;
	Liferay Portal Systems Development shows Java developers how to use Liferay kernel (&lt;strong&gt;version 6.1 or above&lt;/strong&gt;) as a framework to develop custom web and WAP systems which will help you to maximize your productivity gains. Get ready for a rich, friendly, intuitive, and collaborative end-user experience!&lt;/p&gt;
&lt;p&gt;
	The clear, practical examples in the sample application that runs throughout this book will enable professional Java developers to build custom web sites, portals, and mobile applications using Liferay portal as a framework. You will learn how to make all of your organization's data and web content easily accessible by customizing Liferay into a single point of access. The book will also show you how to improve your inter-company communication by enhancing your web sites and WAP sites so that you can share content with colleagues.&lt;/p&gt;
&lt;h2&gt;
	What you will learn from this book&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;
		Provide complete coverage of Liferay Portal 6.1 for both the commercial and open source versions within real example Knowledge Base portlet&lt;/li&gt;
	&lt;li&gt;
		Build basic and advanced MVC portlets with the Service-Builder and RBAC permissions, helping you to build enterprise-ready Java web sites&lt;/li&gt;
	&lt;li&gt;
		Use Ext plugins and Hooks, allowing you to perform custom actions on your portal&lt;/li&gt;
	&lt;li&gt;
		Manage images, documents, videos, audios and records using the Document and Media Library and record management&lt;/li&gt;
	&lt;li&gt;
		Build web content and web forms using the WYSIWYG editors, Custom Attributes, assets tagging and classification, and Dynamic Data List&lt;/li&gt;
	&lt;li&gt;
		Create collaborative and social API complete with Ratings, Comments, Subscriptions, Collaboration, Social Equity, Asset Links and OpenSocial&lt;/li&gt;
	&lt;li&gt;
		Improve your portal with staging, scheduling, remote publishing, caching, clustering, indexing, search and workflow.&lt;/li&gt;
	&lt;li&gt;
		Build WAP mobile-based applications and leverage diverse portlet bridges like JSF, Struts, and Spring MVC&lt;/li&gt;
	&lt;li&gt;
		Use the common API for monitoring and auditing, tracking, scripting, reporting, messaging, and more, helping you to build dynamic web sites smoothly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Approach&lt;/h2&gt;
&lt;p&gt;
	This book focuses on teaching by example. Every chapter provides an overview, and then dives right into hands-on examples so you can see and play with the solution in your own environment.&lt;/p&gt;
&lt;h2&gt;
	Who this book is written for&lt;/h2&gt;
&lt;p&gt;
	This book is for Java developers who don't need any prior experience with Liferay portal. Although Liferay portal makes heavy use of open source frameworks, no prior experience of using these is assumed.&lt;/p&gt;
&lt;h2&gt;
	Table of Contents&lt;/h2&gt;
&lt;p&gt;
	Chapter 1: Liferay Enterprise Portal&lt;/p&gt;
&lt;p&gt;
	Chapter 2: Service Builder and Development Environment&lt;/p&gt;
&lt;p&gt;
	Chapter 3: Generic MVC Portlets&lt;/p&gt;
&lt;p&gt;
	Chapter 4: Ext plugin and Hooks&lt;/p&gt;
&lt;p&gt;
	Chapter 5: Enterprise Content Management&lt;/p&gt;
&lt;p&gt;
	Chapter 6: DDL and WCM&lt;/p&gt;
&lt;p&gt;
	Chapter 7: Collaborative API and Social API&lt;/p&gt;
&lt;p&gt;
	Chapter 8: Indexing, Search and Workflow&lt;/p&gt;
&lt;p&gt;
	Chapter 9: Staging, Scheduling, Publishing and Cache Clustering&lt;/p&gt;
&lt;p&gt;
	Chapter 10: WAP and Portlet Bridges&lt;/p&gt;
&lt;p&gt;
	Chapter 11: Common API&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-11-12T19:27:44Z</dc:date>
  </entry>
  <entry>
    <title>Building federated search indexer against diverse data sources on top of Liferay</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/building-federated-search-indexer-against-diverse-data-sources-on-top-of-liferay" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/building-federated-search-indexer-against-diverse-data-sources-on-top-of-liferay</id>
    <updated>2011-11-08T19:29:27Z</updated>
    <published>2011-10-27T18:15:56Z</published>
    <summary type="html">&lt;p&gt;
	In brief, &lt;strong&gt;OpenSearch&lt;/strong&gt; allows publishing of search results in a format suitable for syndication and aggregation. &lt;strong&gt;Federated search&lt;/strong&gt; is a simultaneous search of multiple online databases or web resources, and it is an emerging feature of automated, web-based library and information retrieval systems. The portal implemented federated search based on OpenSearch standard.&lt;/p&gt;
&lt;p&gt;
	Abstracted from the Liferay development cookbook: &lt;a href="http://www.packtpub.com/liferay-portal-systems-development/book"&gt;&lt;strong&gt;Liferay Portal Systems Development&lt;/strong&gt;&lt;/a&gt; (for liferay portal 6.1 or above version, coming out soon)&lt;/p&gt;
&lt;p&gt;
	This article will address an approach – building federated search indexer against diverse data sources on top of Liferay. First of all, let’s consider a use case. A capital group manages many companies (each company has many users as members), hundreds-million accounts (the entity &lt;strong&gt;Account&lt;/strong&gt;) and hundreds-million related documents (meta-data and real content).&lt;/p&gt;
&lt;p&gt;
	The following diagram shows ER models of the current enterprise database (DB2 for example). In one row, the entity &lt;strong&gt;Seller&lt;/strong&gt; could have many Portfolio; the entity &lt;strong&gt;Portfolio&lt;/strong&gt; could have many Account associated; the entity &lt;strong&gt;Account&lt;/strong&gt; could have many &lt;strong&gt;Document &lt;/strong&gt;associated. In another row, the entity &lt;strong&gt;Company&lt;/strong&gt; could have many User; the entity &lt;strong&gt;User&lt;/strong&gt; could have many DcoumentType associated; the entity &lt;strong&gt;DocumentType&lt;/strong&gt; could have many Document associated.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=1bce092f-9ad4-4e41-bbae-c0420e5b680e&amp;amp;groupId=31578&amp;amp;t=1320116998793" style="width: 660px; height: 194px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	The following is a list of main requirements:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Keep the current enterprise database running AS IS for different existing applications;&lt;/li&gt;
	&lt;li&gt;
		Leverage the portal for user registration and membership management;&lt;/li&gt;
	&lt;li&gt;
		Leverage the portal RBAC for authorization;&lt;/li&gt;
	&lt;li&gt;
		Search documents based on accounts’ info and document meta-data&lt;/li&gt;
	&lt;li&gt;
		Audit users’ activities, track downloads and send update notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Solution overview&lt;/h2&gt;
&lt;p&gt;
	The following diagram shows an example: DB2 has database &lt;strong&gt;schema I&lt;/strong&gt; and &lt;strong&gt;schema II&lt;/strong&gt;; the portal has its own database and database schema. The schema I will be mapped into the Plugin I in the portal; while the schema II will be mapped into the Plugin II in the portal.&lt;/p&gt;
&lt;p&gt;
	The schema status will be used to store updated results – that is, whenever system updates account and / or document meta-data, record the status as a row. This schema is mapped into the plugin status in the portal.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9f17b1f4-1d6f-4949-b1c0-2708a0f3175f&amp;amp;groupId=31578&amp;amp;t=1320076663580" style="width: 660px; height: 285px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	In summary, the solution would be able to provide following feature.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Enhancement of&amp;nbsp; the &lt;strong&gt;Service-builder&lt;/strong&gt; for diverse data sources in plugins&lt;/li&gt;
	&lt;li&gt;
		Read-only approach –&amp;nbsp; data lookup&lt;/li&gt;
	&lt;li&gt;
		The Pull/push approach using the trigger to update the indexer&lt;/li&gt;
	&lt;li&gt;
		Scheduling&amp;nbsp; – check update status by the scheduler&lt;/li&gt;
	&lt;li&gt;
		Federated search indexer&lt;/li&gt;
	&lt;li&gt;
		Audit users' activities, records downloads and set up email notification&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Diverse data sources support in plugins through the service-builder&lt;/h2&gt;
&lt;p&gt;
	First of all, let’s see how to support diverse data sources in plugins through the service-builder. Wiki articles (&lt;a href="http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Connecting+to+Separate+Database+Using+Build-service+in+Plugins+SDK"&gt;Connect to a Database with Plugins SDK&lt;/a&gt; and &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Extending%20Liferay%20Tables%20in%20Another%20Database"&gt;Extend Tables in Another Database&lt;/a&gt;) have addressed how to connect different database with plugins SDK manually. Here we are focusing on how to support diverse data sources in plugins through the service-builder directly.&lt;/p&gt;
&lt;p&gt;
	This new feature and the fix patch have been addressed at the ticket "&lt;a href="http://issues.liferay.com/browse/LPS-22552"&gt;Ability to connect different data sources in plugins through the service-builder&lt;/a&gt;".&amp;nbsp; The following steps show the main idea.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Predefine a file with JDBC settings like &lt;strong&gt;jdbc.properties&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;
		Predefine template file &lt;strong&gt;spring-ext-xml.ftl&lt;/strong&gt; in order to generate the Ext spring configuration &lt;strong&gt;ext-spring.xml&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;
		Update the class &lt;strong&gt;ServiceBuilder.java&lt;/strong&gt; to generate &lt;strong&gt;jdbc.properties&lt;/strong&gt; and &lt;strong&gt;ext-spring.xml&lt;/strong&gt; in plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	After applying the fix patch, the service-builder now supports diverse data sources in plugins.&lt;/p&gt;
&lt;h3&gt;
	Example&lt;/h3&gt;
&lt;p&gt;
	Let’s have a deep look on a real example. The portal (6.0.6 for examle, you can use 6.1 or 6.0 EE) uses MySQL as its default database. In DB2, there is an entity called DocumentType. Now need to bring data of document types into the portal.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Apply the fix patch in the portal&lt;/li&gt;
	&lt;li&gt;
		Build service xml in a plugin as follows&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;&amp;lt;service-builder package-path="com.liferay.mdb"&amp;gt;&lt;br /&gt;
	&amp;lt;namespace&amp;gt;MDB&amp;lt;/namespace&amp;gt;&lt;br /&gt;
	&amp;lt;entity name="DocumentType" table="DOCUMENTTYPE" uuid="false" local-service="true" remote-service="true" data-source="mdbDataSource"&amp;gt;&lt;br /&gt;
	&amp;lt;!-- PK fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="documentTypeId" type="long" primary="true" /&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Other fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="name" type="String" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="description" type="String" /&amp;gt;&lt;br /&gt;
	&amp;lt;/entity&amp;gt;&lt;br /&gt;
	&amp;lt;/service-builder&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Use the service-builder to generate all services.&lt;/li&gt;
	&lt;li&gt;
		Configure the target database (through &lt;strong&gt;jdbc.properties&lt;/strong&gt;) in the plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;## DB2&lt;br /&gt;
	jdbc.mdb.driverClassName=com.ibm.db2.jcc.DB2Driver&lt;br /&gt;
	jdbc.mdb.url=jdbc:db2://192.168.2.138:50000/mcm:deferPrepares=false;fullyMaterializeInputStreams=true;fullyMaterializeLobData=true;progresssiveLocators=2;progressiveStreaming=2;&lt;br /&gt;
	jdbc.mdb.username=lportal&lt;br /&gt;
	jdbc.mdb.password=lportal&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Deploy the plugin&lt;/li&gt;
	&lt;li&gt;
		Manually create database table &lt;em&gt;DOCUMENTTYPE and &lt;/em&gt;insert sample data in the DB2&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;CREATE TABLE DOCUMENTTYPE (&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;documentTypeId bigint not null primary key,&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;name VARCHAR(512),&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;description VARCHAR(512)&lt;br /&gt;
	);&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1001,'Type A', 'Type A');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1002,'Type B', 'Type B');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1003,'Type C', 'Type C');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1004,'Type D', 'Type D');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1005,'Type E', 'Type E');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1006,'Type F', 'Type F');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1007,'Type G', 'Type G');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1008,'Type H', 'Type H')&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1009,'Type I', 'Type I');&lt;br /&gt;
	insert into DOCUMENTTYPE (documentTypeId, name, description) values (1010,'Type J', 'Type J');&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	The following screenshot shows the results of the plugin in the portal.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=199173ed-fe6f-422b-a8c1-b686ed0ecf13&amp;amp;groupId=31578&amp;amp;t=1320175960482" style="width: 660px; height: 241px;" /&gt;&lt;/p&gt;
&lt;h2&gt;
	The pull/push data approach&lt;/h2&gt;
&lt;p&gt;
	The entities DocumentType and Company have hundreds rows. Thus these rows could be retrieved by the Liferay API directly. For example:&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;int count = 0;&lt;br /&gt;
	List&amp;lt;DocumentType&amp;gt; list = Collections.synchronizedList(new ArrayList&amp;lt;DocumentType&amp;gt;());&lt;br /&gt;
	try {&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;count = DocumentTypeLocalServiceUtil.getDocumentTypesCount();&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;list = DocumentTypeLocalServiceUtil.getDocumentTypes(0, count);&lt;br /&gt;
	} catch (Exception e) {}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	This is the beauty of the service-builder.&lt;/p&gt;
&lt;p&gt;
	The entities Account and Document have hundreds-million rows. Thus these rows could be retrieved by the Liferay API for first-time indexing only, not for checking updates.&amp;nbsp; Whenever Account and Document got updated in the DB2, trigger the updates in the table &lt;strong&gt;status&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
	In the portal, define a scheduler in the plugin – check the update of the table &lt;strong&gt;status&lt;/strong&gt; regular base (for example, in one minute).&amp;nbsp; Whenever found rows in the table &lt;strong&gt;status&lt;/strong&gt;, retrieve these rows (and related entities like Account and Document) from the DB2, update the same in the indexer of the portal, and then remove these rows from the table &lt;strong&gt;status&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
	Building federated search indexer&lt;/h2&gt;
&lt;p&gt;
	Based on the entities Seller, Portfolio, Account, Company, User, Document Types, Document and View permission in the portal, build federated indexer for the plugin. From now on, you could be able to search documents via the portal default search engine.&lt;/p&gt;
&lt;p&gt;
	Since all entities (from the DB2) got mounted into the portal, you can audit user activities; record downloads and set up email notification whenever in need.&lt;/p&gt;
&lt;h2&gt;
	Summary&lt;/h2&gt;
&lt;p&gt;
	The approach – building federated search indexer against diverse data sources on top of Liferay – would be useful when integrating existing enterprise database, while keeping the existing applications running. And the new feature (&lt;a href="http://issues.liferay.com/browse/LPS-22552"&gt;LPS-22552)&lt;/a&gt; would be nice in order to improve the functions of the service-builder.&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-10-27T18:15:56Z</dc:date>
  </entry>
  <entry>
    <title>Auditing document-downloads via Document Library Record plugin</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/auditing-document-downloads-via-document-library-record-plugin" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/auditing-document-downloads-via-document-library-record-plugin</id>
    <updated>2011-09-16T17:40:07Z</updated>
    <published>2011-09-08T00:16:16Z</published>
    <summary type="html">&lt;p&gt;
	As you have been noticed, the version 6.1 adds a lot of CMS (Document Library) features. The following is a list of these features, not the full list.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Capability to manage different document types: basic document, image (Image Gallery is merged into Document Library), video, audio, etc.&lt;/li&gt;
	&lt;li&gt;
		Providing Dynamic Data List (DDL) and Dynamic Data Mapping (DDM) - see blogs &lt;a href="http://www.liferay.com/web/marcellus.tavares/blog/-/blogs/dynamic-data-lists-i"&gt;Dynamic Data Lists I&lt;/a&gt; and &lt;a href="http://www.liferay.com/web/marcellus.tavares/blog/-/blogs/dynamic-data-lists-ii"&gt;Dynamic Data Lists II&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
		Ability to mount different repositories via CMIS (see blogs &lt;a href="http://www.liferay.com/web/alexander.chow/blog/-/blogs/7670631"&gt;Mounting Multiple CMIS Repositories on Liferay 6.1&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;
		Capability to define custom document types in the runtime&lt;/li&gt;
	&lt;li&gt;
		Capability to define custom meta-data of document types in the runtime&lt;/li&gt;
	&lt;li&gt;
		Ability to make custom document types and their meta-data searchable&lt;/li&gt;
	&lt;li&gt;
		Ability to apply Workflow on document-type-level&lt;/li&gt;
	&lt;li&gt;
		Ability to set up asset-links among assets (like Blogs Entry, Comments, Message Boards Message, Web Content, Calendar Event, Document Library Document, Wiki Page)&lt;/li&gt;
	&lt;li&gt;
		And more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	This article will introduce an additiona feature: tracking who downloaded documents in Liferay portal 6.1 via Document Library Record plugin.&lt;/p&gt;
&lt;h2&gt;
	Use cases&lt;/h2&gt;
&lt;p&gt;
	The plugin (Document Library Record plugin) will consider following use cases.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Audit document-downloads: who downloaded the document and when the document got downloaded.&lt;/li&gt;
	&lt;li&gt;
		Define resources to be audited:&amp;nbsp; only defined resources will get audited&lt;/li&gt;
	&lt;li&gt;
		Distinguish auditing condition: trace non-signed-in required resource and trace sign-in required resource&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;
		Report document-downloads: reporting by group, by user, by resource instance, by document-type, by date (weekly, monthly, yearly).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Abstracted from the book: &lt;a href="http://www.amazon.com/Liferay-Portal-6-2-Systems-Development/dp/1849515980"&gt;&lt;strong&gt;Liferay Portal Systems Development&lt;/strong&gt;&lt;/a&gt; (&lt;strong&gt;A Liferay cookbook&lt;/strong&gt; for developers using version &lt;strong&gt;6.1&lt;/strong&gt; or above)&lt;/p&gt;
&lt;h2&gt;
	Possible implementation&lt;/h2&gt;
&lt;p&gt;
	The plugin could be implemented in the following steps&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Specify two entities for Document Library Record: DLRecord and DLRecordLog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	The entity DLRecord is defined as follows.&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;span style="font-size:12px;"&gt;&lt;em&gt;&amp;lt;!-- PK fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="definitionId" type="long" primary="true" /&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Audit fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="folderId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="documentType" type="String" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="companyId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="groupId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="userId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="createDate" type="Date" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="modifiedBy" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="modifiedDate" type="Date" /&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Other fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="name" type="String" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="title" type="String" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="signinRequired" type="boolean" /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	The entity DLRecordLog is defined as follows.&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;&lt;span style="font-size:12px;"&gt;&amp;lt;!-- PK fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="logId" type="long" primary="true" /&amp;gt;&lt;br /&gt;
	&amp;lt;!-- Audit fields --&amp;gt;&lt;br /&gt;
	&amp;lt;column name="definitionId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="documentType" type="String" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="companyId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="groupId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="userId" type="long" /&amp;gt;&lt;br /&gt;
	&amp;lt;column name="createDate" type="Date" /&amp;gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Record document-downloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	The following is sample code.&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;
	&lt;em&gt;&lt;span style="font-size:12px;"&gt;try {&lt;br /&gt;
	DLRecordDefinition dLRecordDefinition =&lt;br /&gt;
	DLRecordDefinitionLocalServiceUtil.findByF_N(folderId, name);&lt;br /&gt;
	if (dLRecordDefinition != null) {&lt;br /&gt;
	&lt;br /&gt;
	ThemeDisplay themeDisplay =&lt;br /&gt;
	(ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);&lt;br /&gt;
	if (dLRecordDefinition.isSigninRequired()&lt;br /&gt;
	&amp;amp;&amp;amp; !themeDisplay.isSignedIn()) {&lt;br /&gt;
	response.sendRedirect(themeDisplay.getURLSignIn());&lt;br /&gt;
	}&lt;br /&gt;
	long companyId = themeDisplay.getCompanyId();&lt;br /&gt;
	long groupId = themeDisplay.getScopeGroupId();&lt;br /&gt;
	long userId = themeDisplay.getUserId();&lt;br /&gt;
	&lt;br /&gt;
	DLRecordLogLocalServiceUtil.addDLRecordLog(&lt;br /&gt;
	dLRecordDefinition.getDefinitionId(), companyId,&lt;br /&gt;
	groupId, userId);&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	catch (Exception e) {&lt;br /&gt;
	// TODO Auto-generated catch block&lt;br /&gt;
	e.printStackTrace();&lt;br /&gt;
	}&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
	Results&lt;/h2&gt;
&lt;p&gt;
	Here I share a few screenshots from the version 6.1 (revision 88826).&lt;/p&gt;
&lt;p&gt;
	Resource search&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=5c6a044d-dcb1-4923-929f-4740ec2d222f&amp;amp;groupId=31578&amp;amp;t=1315612632151" style="width: 660px; height: 310px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Trace definitions&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=a97c933b-d5fb-4e8b-9364-c50c444a5165&amp;amp;groupId=31578&amp;amp;t=1315527372289" style="width: 580px; height: 153px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	List records&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=d71cd05d-5d8b-494f-8f2e-770234ad1c90&amp;amp;groupId=31578&amp;amp;t=1315527372289" style="width: 582px; height: 181px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	When downloading a document (basic document, image, video, audio, etc.), audit it.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=24cb0cb2-25b4-4fc9-885a-e6a2c4e5a536&amp;amp;groupId=31578&amp;amp;t=1315528592474" style="width: 660px; height: 343px;" /&gt;&lt;/p&gt;
&lt;h2&gt;
	Summary&lt;/h2&gt;
&lt;p&gt;
	The plugin provided capability to audit document-downloads. It did work fine in the version 6.1. Of course, the plugin did also work well in the version 6 (like 6.0.6 CE, 6.0 EE SP1, 6.0 EE SP2, etc.). In addition, I would send a ton of thanks to Liferay development team who created the draft version of Document Library Record portlet.&lt;/p&gt;
&lt;h2&gt;
	Download URLs&lt;/h2&gt;
&lt;p&gt;
	&lt;a href="http://www.liferay.com/documents/31578/102aee44-28fc-41d6-a3f3-14099669a432"&gt;6.0.12&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	6.0.11&lt;/p&gt;
&lt;p&gt;
	6.0.10&lt;/p&gt;
&lt;p&gt;
	6.0.6&lt;/p&gt;
&lt;p&gt;
	6.1.0&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-09-08T00:16:16Z</dc:date>
  </entry>
  <entry>
    <title>Building social-media-rich newsroom on top of Liferay portal</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/building-social-media-rich-newsroom-on-top-of-liferay-portal" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/building-social-media-rich-newsroom-on-top-of-liferay-portal</id>
    <updated>2011-06-21T22:07:35Z</updated>
    <published>2011-06-20T17:58:47Z</published>
    <summary type="html">&lt;p&gt;
	Loosely speaking, a newsroom is the place where journalists—reporters, editors, and producers, along with other staffers—work to gather news to be published in a newspaper or magazine or broadcast on television, cable or radio. &amp;nbsp;As you have known already, Liferay Portal is an enterprise web platform for building business solutions that deliver immediate results and long-term value. This article will use &lt;a href="http://newsroom.cisco.com/home"&gt;The Network&lt;/a&gt; as an example to show:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Which kind of portal core features leveraged to build social-media-rich newsroom on top of Liferay.&lt;/li&gt;
	&lt;li&gt;
		Which kind of new features added to build social-media-rich newsroom on top of Liferay.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	The Network is trying to tell stories and share information on the topics that are the most important, namely: Video, Collaboration, Core Networks, Mobility, Security, Data Center, Culture … and, more parochially to Social Media. The Network requires an environment where the editorials team could prepare releases in the staging and remotely publish releases to the Production. Technically, it mainly manages five content types.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=fc3d51db-0b22-471e-94a5-853d8b6141cd&amp;amp;groupId=31578&amp;amp;t=1308596634117" style="width: 32px; height: 32px;" /&gt; Feature&lt;/li&gt;
	&lt;li&gt;
		&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=a756ecc2-031b-4e51-8597-25e09498b4df&amp;amp;groupId=31578&amp;amp;t=1308596634194" style="width: 32px; height: 32px;" /&gt; Press release&lt;/li&gt;
	&lt;li&gt;
		&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?img_id=9484475&amp;amp;igImageId=9484474&amp;amp;igSmallImage=1&amp;amp;t=1308596634291" style="width: 32px; height: 32px;" /&gt; Video&lt;/li&gt;
	&lt;li&gt;
		&amp;nbsp;&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?img_id=9484464&amp;amp;t=1308596634163" style="width: 32px; height: 32px;" /&gt; Podcast&lt;/li&gt;
	&lt;li&gt;
		&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?img_id=9484472&amp;amp;t=1308596634261" style="width: 32px; height: 32px;" /&gt; Bookmark&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Main features overview&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;
		LDAP users and user group import – speed up the LDAP import processes and Liferay authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	There is a big user base in over 50K+ user groups in LDAP. When logged in as a user from LDAP, it took 20-30 seconds by default. After applying the new feature fix patch, it takes less than 1 second. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-14322"&gt;LPS-14322&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Secure the user LDAP password – do not import LDAP user’s password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	When importing users from LDAP, user’s info and password got imported. Of course, all passwords stored in Liferay are secure. Especially, the LDAP password mapping field is optional. In some use cases, the fact Liferay stores users’ password is against some companies’ security policy rules. With the new feature fix patch, Liferay would not import user's password from LDAP. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-13933"&gt;LPS-13933&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Remote staging and publishing mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	All editorial team work in the clustered staging environment; but open the clustered production to the public only.&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Cache Clustering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Both staging and production are clustered.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Secure the LDAP user info in the staging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	By default, there is a dummy user in both the staging and the product. All editorial users exist in the staging only. Their daily work is to create / update press release, and schedule to publish to the product. This feature got fixed, referring to &lt;a href="http://issues.liferay.com/browse/LPS-17251"&gt;LPS-17251&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Keep UUID same in the remote publishing process&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Export and imports all assets and their associations: tags, categories, custom fields, etc.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Federated indexing and search mechanism&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Index five content types (more content types) in one place; and index tags, categories, custom fields, views, shared number, etc. Provide services’ URL to search latest views, most viewed, etc.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Configurable RSS feeds services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Make RSS feeds configurable. Search RSS results from the index – the performance is very good.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Home URL and friendly URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/making-home-url-and-web-content-seo-friendly-url-highly-configurable-in-multiple-web-sites"&gt;Making home URL and web content SEO friendly URL highly configurable in multiple web sites&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Category cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Search categories from the index, instead of the database. – The performance is very good.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Track Social media sharing and most shared&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Provide a model to present social media sharing; provide services’ URL to update social media shared info;&amp;nbsp;&amp;nbsp; provide services’ URL to search social media most shared. This is native Liferay tracking system – details will be addressed in another post.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Integrate Facebook activity, twitter feeds, and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
	Implementation examples&lt;/h2&gt;
&lt;p&gt;
	Latest news, most viewed and most shared – an overview&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=e452547f-9037-4020-a169-917aed9efc8e&amp;amp;groupId=31578&amp;amp;t=1308682871698" style="width: 660px; height: 462px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Searching by FROM date and TO date, filtering by content types, and categories, and pagination – an overview&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=cebb5e73-3e4a-46cc-962e-75bb48a1039e&amp;amp;groupId=31578&amp;amp;t=1308682871657" style="width: 660px; height: 413px;" /&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Remote staging and publishing mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Both staging and production have following settings&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;tunnel.servlet.hosts.allowed=127.0.0.1,SERVER_IP&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;tunnel.servlet.https.required=false&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Cache Clustering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Both staging and production have following clustering settings&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;net.sf.ehcache.configurationResourceName=/ehcache/hibernate-clustered.xml&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;ehcache.multi.vm.config.location=/ehcache/liferay-multi-vm-clustered.xml&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;image.hook.file.system.root.dir=/share/liferay/data/images&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;dl.hook.file.system.root.dir=/share/liferay/data/document_library&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;cluster.link.enabled=true&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;lucene.replicate.write=true&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Federated indexing and search mechanism&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Latest news&lt;br /&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=latest&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=feature:press-release&amp;amp;categoryId=14788"&gt;?cmd=latest&amp;amp;limit=10&amp;amp;contentType=feature:press-release&amp;amp;categoryId=14788&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Parameters:&lt;br /&gt;
	&lt;em&gt;categoryId=id&lt;br /&gt;
	limit=number&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	Most viewed&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=viewed&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=feature"&gt;?cmd=viewed&amp;amp;limit=10&amp;amp;contentType=feature&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	All News&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=all-news&amp;amp;groupId=10157&amp;amp;start=0&amp;amp;end=20&amp;amp;contentType=feature:press-release&amp;amp;displayDateLT=20110101&amp;amp;&amp;amp;displayDateGT=20100101&amp;amp;categoryIds=14788:22287"&gt;?cmd=all-news&amp;amp;start=0&amp;amp;end=20&amp;amp;contentType=feature:press-release&amp;amp;displayDateLT=20110101&amp;amp;&amp;amp;displayDateGT=20100101&amp;amp;categoryIds=14788:22287&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Parameters:&lt;br /&gt;
	&lt;em&gt;contenType= all[:feature:press-release:video:podcast:bookmark]&lt;br /&gt;
	displayDateLT=YYYYMMDD&lt;br /&gt;
	displayDateGT=YYYYMMDD&lt;br /&gt;
	categoryIds=id[:id]&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Configurable RSS feeds services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Both feature and press-release – as you can see, no future content got displayed. Is it nice feature?&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=rss&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=feature|press-release"&gt;?cmd=rss&amp;amp;limit=10&amp;amp;contentType=feature|press-release&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Feature&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=rss&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=feature"&gt;?cmd=rss&amp;amp;limit=10&amp;amp;contentType=feature&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Press release&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=rss&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=press-release"&gt;?cmd=rss&amp;amp;limit=10&amp;amp;contentType=press-release&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Category cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=categorycloud&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=feature:press-release"&gt;?cmd=categorycloud&amp;amp;limit=10&amp;amp;contentType=feature:press-release&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Parameters: &lt;em&gt;contentType=feature[:press-release]&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Track social media sharing and most shared&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;a href="http://newsroom.cisco.com/c/journal/get_articles?cmd=shared&amp;amp;groupId=10157&amp;amp;limit=10&amp;amp;contentType=feature&amp;amp;categoryId=14788"&gt;?cmd=shared&amp;amp;limit=10&amp;amp;contentType=feature&amp;amp;categoryId=14788&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
	Expected features&lt;/h2&gt;
&lt;p&gt;
	Of course, there are still a set of features which are expected in newsroom systems. The following are some of them.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Asset-level scheduling and remote publishing capability, refer to &lt;a href="http://issues.liferay.com/browse/LPS-17235"&gt;LPS-17235&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
		Asset-version-based scheduling and remote publishing capability, refer to &lt;a href="http://issues.liferay.com/browse/LPS-17395"&gt;LPS-17395&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
		Page-version-based scheduling and remote publishing capability, refer to &lt;a href="http://issues.liferay.com/browse/LPS-6431"&gt;LPS-6431&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
		Scheduling and remote publishing dashboard, refer to &lt;a href="http://issues.liferay.com/browse/LPS-17400"&gt;LPS-17400&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;
		Ability to show indexing progress in Control Panel, refer to &lt;a href="http://issues.liferay.com/browse/LPS-18269"&gt;LPS-18269&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	What is your wish-list? Your comments or suggestions?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-06-20T17:58:47Z</dc:date>
  </entry>
  <entry>
    <title>Securing users’ information in the staging when using remote publishing function</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/securing-users’-information-in-the-staging-when-using-remote-publishing-function" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/securing-users’-information-in-the-staging-when-using-remote-publishing-function</id>
    <updated>2011-05-18T20:20:13Z</updated>
    <published>2011-05-14T17:15:03Z</published>
    <summary type="html">&lt;p&gt;
	Liferay portal provides remote staging and publishing capability through which the users can select subsets of pages and data (both portal core assets and custom assets), and transfer them to the live site—that is, remote portal instance.&lt;/p&gt;
&lt;p&gt;
	There are two types of staging: Local Live and Remote Live. &lt;strong&gt;Local Live&lt;/strong&gt; - Within the current portal environment, a clone of the current site will be created. This clone contains copies all existing pages and data of portlets. This clone becomes the local Staging while the original becomes the local Live. &lt;strong&gt;Remote Live&lt;/strong&gt; - A connection is built between this site and target existing in a remote instance. The connection settings cover persistent network configuration which defines how to locate the remote instance when a publishing event occurs. This site becomes the remote Staging while the remote site becomes the remote Live.&lt;/p&gt;
&lt;p&gt;
	In the previous post, we have discussed how to &lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-lar-and-remote-publishing-capabilities-on-custom-assets-in-plugins"&gt;apply LAR and remote publishing capabilities on custom assets in Plugins&lt;/a&gt;. We also addressed the new feature how to &lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/keeping-user-password-secure-with-ldap-integration"&gt;keep user password secure with LDAP integration&lt;/a&gt; when building the staging. This article will address a new feature: how to secure users’ information in the staging when using Remote Live mode.&lt;/p&gt;
&lt;p&gt;
	Let’s take a look on a scenario. There are clustered-staging servers and clustered-product servers. By default, there is a dummy user in both the staging and the product. All editorial users exist in the staging only. Their daily work is to create / update press release, and schedule to publish to the product.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?img_id=8818334&amp;amp;t=1305393576429" style="width: 660px; height: 232px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Use case I: &lt;/strong&gt;secure the users’ information in the staging when using remote publishing function.&lt;/p&gt;
&lt;h2&gt;
	Solution&lt;/h2&gt;
&lt;p&gt;
	In the staging server, pre-define a dummy user screen name in the &lt;em&gt;portal.properties&lt;/em&gt;. This dummy user will impersonate all users who have permission to handle remote publishing.&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;## Tunnel dummy user enabled;&lt;br /&gt;
	tunnel.dummy.user.enabled=false&lt;br /&gt;
	&lt;br /&gt;
	## tunnel dummy user screen name.&lt;br /&gt;
	## The portal will consume this dummy user screen name for remote publishing&lt;br /&gt;
	## if the property tunnel.dummy.user.enabled is set to true.&lt;br /&gt;
	tunnel.dummy.user.screenname=test&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	Then before calling remote group, impersonate the current user using the dummy user. The following is code snippet.&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;User user = UserLocalServiceUtil.getUser(permissionChecker.getUserId());&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;em&gt;if(_TUNNEL_DUMMY_USER_ENABLED)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;user = UserLocalServiceUtil.getUserByScreenName(&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;permissionChecker.getCompanyId(), _TUNNEL_DUMMY_USER_SCREENNAME);&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
	Summary&lt;/h2&gt;
&lt;p&gt;
	As you can see, this fix is very useful when you want to secure the user password in LDAP server, and secure all users info in the staging. For more details, you may check the status of the ticket &lt;a href="http://issues.liferay.com/browse/LPS-17251"&gt;LPS-17251&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	Last but not least, I'd like to send special thanks to Eduardo Carneiro and Mark Wynne who provided these requirements.&lt;/p&gt;
&lt;h2&gt;
	Challenges&lt;/h2&gt;
&lt;p&gt;
	The feature of staging and remote publishing is cool! But real use cases require more new features on top. The following are some of them.&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Challenge I&lt;/strong&gt;: Asset-level scheduling and remote publishing capability. For example, editorial User A created press release articles A1, A2, A3. He / She going to schedule to publish A1 in 30 minutes, A2 in 60 minutes and A3 in 120 minutes. And meanwhile, editorial User B created press release articles B1, B2, B3. He / She going to schedule to publish B1 in 5 minutes, B2 in 180 minutes and B3 in 360 minutes.&amp;nbsp; As you can see, the portal should provide asset-level scheduling and remote publishing capability. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-17235"&gt;LPS-17235&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Challenge II&lt;/strong&gt;:&amp;nbsp; Asset-version-based scheduling and remote publishing capability. For example, editorial User A created press release article A and different versions Av1, Av2, Av3. He / She is going to schedule to publish Av1 in 30 minutes, Av2 in 60 minutes and Av3 in 120 minutes. Similar scenario happens for other editorial users. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-17395"&gt;LPS-17395&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Challenge III&lt;/strong&gt;: Page-version-based scheduling and remote publishing capability. For example, editorial User A updated top story page and published this page in three time slots Pv1, Pv2 and Pv3. The final version of top story page in Remote Live is Pv3. For some reason, he / she are going to revert to the version Pv1. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-6431"&gt;LPS-6431&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Challenge IV&lt;/strong&gt;: scheduling and remote publishing dashboard. Request an admin-dashboard to oversee remote publishing history and to manage on-going scheduled events.&amp;nbsp; As editorial administrator, he / she needs a dashboard where he / she could see all history – asset-level, asset-version-level , page-level and page-version-level&amp;nbsp; remote-publishing content; and see all on-going&amp;nbsp; scheduled events. In case, he / she would be able to cancel some events. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-17400"&gt;LPS-17400&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Your comments / suggestions / feedback?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-05-14T17:15:03Z</dc:date>
  </entry>
  <entry>
    <title>Highly configurable RSS feeds for web content and Struts action hooks</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/highly-configurable-rss-feeds-for-web-content-and-struts-action-hooks" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/highly-configurable-rss-feeds-for-web-content-and-struts-action-hooks</id>
    <updated>2011-03-25T12:26:00Z</updated>
    <published>2011-03-23T19:40:42Z</published>
    <summary type="html">&lt;p&gt;&lt;span style="font-size: small;"&gt;RSS (Really Simple Syndication) is a family of web feed formats used to publish frequently updated works&amp;mdash;such as blog entries, news headlines, audio, and video&amp;mdash;in a standardized format. A web feed (or news feed) is a data format used for providing users with frequently updated content. Content distributors syndicate a web feed, thereby allowing users to subscribe to it. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;Liferay portal first provides &lt;a href="http://www.liferay.com/web/raymond.auge/blog/-/blogs/secure-rss-feeds"&gt;secure RSS feeds&lt;/a&gt; (see Ray&amp;rsquo;s blogs post). All secure RSS feeds transparently support BASIC Authentication. Liferay portlet supports RSS feed type: &lt;strong&gt;ATOM 1.0&lt;/strong&gt;, &lt;strong&gt;RSS 1.0&lt;/strong&gt; and &lt;strong&gt;RSS 2.0&lt;/strong&gt;. &lt;br /&gt;Liferay portal provides RSS feed for its content types like blogs entries, web content articles (by feeds), message boards threads, wiki pages, and so on. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Message Boards threads (using &lt;strong&gt;Struts Action&lt;/strong&gt;):&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;/c/message_boards/rss?p_l_id=10447&amp;amp;mbCategoryId=10157&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Blogs entries (using &lt;strong&gt;Struts PortletAction&lt;/strong&gt;):&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;/web/guest/test/-/blogs/rss&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Wiki pages (using &lt;strong&gt;Struts Action&lt;/strong&gt;):&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;/c/wiki/rss?p_l_id=10447&amp;amp;companyId=10132&amp;amp;nodeId=11635&amp;amp;title=FrontPage&amp;amp;type=rss&amp;amp;version=2.0&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Asset Publisher (using &lt;strong&gt;Struts PortletAction&lt;/strong&gt;):&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;/web/guest/test/-/asset_publisher/7Pnm/rss?p_p_cacheability=cacheLevelPage&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Web content feeds (use case I - using &lt;strong&gt;Struts PortletAction&lt;/strong&gt;):&lt;/p&gt;&lt;p&gt;&lt;em&gt;/web/guest/home/-/journal/rss/11301?doAsGroupId=10157&amp;amp;refererPlid=10447&amp;amp;_15_groupId=10157&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Especially the portal provides RSS feeds for web content in following URLs:&lt;/p&gt;&lt;p&gt;Use case II (using &lt;strong&gt;Action&lt;/strong&gt;): for a list of articles, including different versions&lt;/p&gt;&lt;p&gt;&lt;em&gt;/c/journal/get_articles?groupId=@value@[&amp;amp;templateId=@value@][&amp;amp;structureId=@value@][&amp;amp;orderBy=@value@][&amp;amp;orderByType=@value@][&amp;amp;orderByCol=@value@][&amp;amp;type=@value@][&amp;amp;displayDateGT=@value@][&amp;amp;displayDateLT=@value@][&amp;amp;delta=@value@]&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Use case III (using &lt;strong&gt;Action&lt;/strong&gt;): for a given article by article ID&lt;/p&gt;&lt;p&gt;&lt;em&gt;/c/journal/get_article?groupId=@value@&amp;amp;articleId=@value@&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Above features are very useful in many use cases. Here let&amp;rsquo;s consider different requirements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use Case A&lt;/strong&gt;: Web content RSS feeds should be presented in authentication public path, like /c/web_content/rss&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use Case B&lt;/strong&gt;: Web content RSS feeds should be able to feed articles by different article types like press-release, feature, and types combination like press-release and feature&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use Case C&lt;/strong&gt;: Web content RSS feeds should be able to feed articles by authors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use Case D&lt;/strong&gt;: Web content RSS feeds should be ordered by either modified date or display date; and only show the latest version.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This article will first address an implementation for above use cases (A, B, C, D) in Liferay 6; then it will show how to leverage &lt;a href="http://www.liferay.com/web/mika.koivisto/blog/-/blogs/overriding-and-adding-struts-actions-from-hook-plugins"&gt;&lt;strong&gt;Struts action hooks&lt;/strong&gt;&lt;/a&gt; to implement above use cases in Liferay 6.1.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Making RSS feeds of web content highly configurable&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In order to make RSS feeds configurable, add following properties.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;## Custom RSS feeds&lt;br /&gt;&lt;br /&gt;## default type and version: ATOM 1.0, RSS 1.0, RSS 2.0&lt;br /&gt;custom.rss.default.type=atom&lt;br /&gt;custom.rss.default.version=10&lt;br /&gt;&lt;br /&gt;## custom RSS feeds display&lt;br /&gt;## display style: abstract, full-content, content, title&lt;br /&gt;custom.rss.display.style=content&lt;br /&gt;&lt;br /&gt;## set default content field &lt;br /&gt;## if custom.rss.display.style is set to content&lt;br /&gt;custom.rss.default.content.field=CONTENT&lt;br /&gt;&lt;br /&gt;## set maximum characters &lt;br /&gt;custom.rss.display.length=350&lt;br /&gt;&lt;br /&gt;## set default content type&lt;br /&gt;custom.rss.default.content.type=press-release&lt;br /&gt;&lt;br /&gt;## set default maximum value&lt;br /&gt;custom.rss.default.delta.max=50&lt;br /&gt;&lt;br /&gt;## enable or disable to display author&lt;br /&gt;custom.rss.display.author.enabled=false&lt;br /&gt;&lt;br /&gt;## Custom RSS feeds links URL&lt;br /&gt;## enable or disable RSS links URL&lt;br /&gt;## custom.rss.link.preview.enabled is in use if &lt;br /&gt;## custom.rss.link.enabled is set to true.&lt;br /&gt;## custom friendly URL like /${content.type}/${id}/${title} will be in use when &lt;br /&gt;## custom.rss.link.preview.enabled is set to false and &lt;br /&gt;## custom.rss.link.friendly.url.enabled is set to true &lt;br /&gt;custom.rss.link.enabled=true&lt;br /&gt;custom.rss.link.preview.enabled=false&lt;br /&gt;custom.rss.link.friendly.url.enabled=true&lt;br /&gt;&lt;br /&gt;## Custom RSS feeds title prefix&lt;br /&gt;custom.rss.title.prefix=The Network&lt;br /&gt;custom.rss.title.author.prefix=Contributed Articles by&lt;br /&gt;&lt;br /&gt;## Custom RSS feeds via author&lt;br /&gt;## possible values: press-release, feature&lt;br /&gt;custom.rss.author.content.type=feature&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;New features in Liferay 6&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Leveraging auth public path: &lt;em&gt;/c/journal/get_articles&lt;/em&gt;, customize &lt;strong&gt;&lt;em&gt;GetArticlesAction&lt;/em&gt;&lt;/strong&gt; extending &lt;strong&gt;&lt;em&gt;Action&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Testing results:&lt;/p&gt;&lt;p&gt;Press releases&lt;/p&gt;&lt;p&gt;&lt;img width="660" height="381" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=2bada79f-3d73-44ff-9f79-c1ace6b865ce&amp;amp;groupId=31578&amp;amp;t=1300997017406" /&gt;&lt;/p&gt;&lt;p&gt;Features&lt;/p&gt;&lt;p&gt;&lt;img width="660" height="377" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9eef749a-1164-4c60-ba9d-5dfef4b896f6&amp;amp;groupId=31578&amp;amp;t=1300997017409" /&gt;&lt;/p&gt;&lt;p&gt;Press releases and features&lt;/p&gt;&lt;p&gt;&lt;img width="660" height="331" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=58518ad1-9dad-4bb0-832d-8293c8803fce&amp;amp;groupId=31578&amp;amp;t=1300997017411" /&gt;&lt;/p&gt;&lt;p&gt;Features by author&lt;/p&gt;&lt;p&gt;&lt;img width="660" height="339" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=07f3f572-1044-42c1-bcff-e45f5b17d0c2&amp;amp;groupId=31578&amp;amp;t=1300997017412" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Using Struts action hooks in Liferay 6.1&amp;nbsp; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In brief, there are several kinds of hooks: &lt;strong&gt;portal properties&lt;/strong&gt;, &lt;strong&gt;language properties&lt;/strong&gt;, &lt;strong&gt;custom JSP&lt;/strong&gt;, &lt;strong&gt;indexer post processors&lt;/strong&gt;, &lt;strong&gt;service wrappers&lt;/strong&gt;, &lt;strong&gt;servlet filters and servlets mapping&lt;/strong&gt;, and &lt;strong&gt;struts actions&lt;/strong&gt; in Liferay 6.1.&lt;/p&gt;&lt;p&gt;Struts action hook provides capabilities to override existing struts action and / or add new struts actions from plugins. With struts action hook, you can either add new struts actions to the portal core from plugins, or override any existing action within the portal core from plugins.&lt;/p&gt;&lt;p&gt;Above use cases (A, B, C and D, using auth public path &lt;strong&gt;/c/web_content/rss&lt;/strong&gt;) could be implemented through portal properties and struts actions in following steps.&lt;/p&gt;&lt;p&gt;First, edit the liferay-hook.xml and add following fragment.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt;hook&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;portal-properties&amp;gt;portal.properties&amp;lt;/portal-properties&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;struts-action&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;struts-action-path&amp;gt;/web_content/rss&amp;lt;/struts-action-path&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;struts-action-impl&amp;gt;com.liferay.knowledgebase.hook.action.RSSAction&amp;lt;/struts-action-impl&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/struts-action&amp;gt;&lt;br /&gt;&amp;lt;/hook&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;As shown in the above code, it specified at least three kinds of hooks: portal properties hooks and struts action hooks.&lt;/p&gt;&lt;p&gt;Secondly, add following line in the portal.properties.&lt;/p&gt;&lt;p&gt;&lt;em&gt;auth.public.paths=/web_content/rss&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The property &lt;em&gt;auth.public.paths &lt;/em&gt;specifies public paths that don&amp;rsquo;t require authentication.&lt;/p&gt;&lt;p&gt;Last but not least, implement same logic in the &lt;strong&gt;com.liferay.knowledgebase.hook.action.RSSAction&lt;/strong&gt;,&lt;span style="font-size: small;"&gt; which extends &lt;strong&gt;BaseStrutsAction&lt;/strong&gt; implementing &lt;strong&gt;StrutsAction&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;Abstracted from the book: &lt;strong&gt;Liferay Systems Development&lt;/strong&gt; - &lt;strong&gt;Liferay Cookbook&lt;/strong&gt; (coming out soon).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Summary&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, new features (implementing use cases A, B, C, D) make RSS feeds of web content highly configurable - related ticket &lt;a href="http://issues.liferay.com/browse/LPS-16041"&gt;LPS-16041&lt;/a&gt;.&amp;nbsp; In Liferay 6 or previous versions, these features were implemented as a fix patch, while same features were implemented in the plugin via &lt;strong&gt;portal properties hook&lt;/strong&gt; plus &lt;strong&gt;struts actions hook&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Are these features useful?&lt;/p&gt;&lt;p&gt;Any suggestions or comments?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-03-23T19:40:42Z</dc:date>
  </entry>
  <entry>
    <title>Making home URL and web content SEO friendly URL highly configurable in multiple web sites</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/making-home-url-and-web-content-seo-friendly-url-highly-configurable-in-multiple-web-sites" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/making-home-url-and-web-content-seo-friendly-url-highly-configurable-in-multiple-web-sites</id>
    <updated>2011-03-25T14:42:08Z</updated>
    <published>2011-03-08T20:06:00Z</published>
    <summary type="html">&lt;p&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves /&gt;
  &lt;w:TrackFormatting /&gt;
  &lt;w:PunctuationKerning /&gt;
  &lt;w:ValidateAgainstSchemas /&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF /&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables /&gt;
   &lt;w:SnapToGridInCell /&gt;
   &lt;w:WrapTextWithPunct /&gt;
   &lt;w:UseAsianBreakRules /&gt;
   &lt;w:DontGrowAutofit /&gt;
   &lt;w:SplitPgBreakAndParaMark /&gt;
   &lt;w:DontVertAlignCellWithSp /&gt;
   &lt;w:DontBreakConstrainedForcedTables /&gt;
   &lt;w:DontVertAlignInTxbx /&gt;
   &lt;w:Word11KerningPairs /&gt;
   &lt;w:CachedColBalance /&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math" /&gt;
   &lt;m:brkBin m:val="before" /&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
   &lt;m:smallFrac m:val="off" /&gt;
   &lt;m:dispDef /&gt;
   &lt;m:lMargin m:val="0" /&gt;
   &lt;m:rMargin m:val="0" /&gt;
   &lt;m:defJc m:val="centerGroup" /&gt;
   &lt;m:wrapIndent m:val="1440" /&gt;
   &lt;m:intLim m:val="subSup" /&gt;
   &lt;m:naryLim m:val="undOvr" /&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;span style="font-size: small;"&gt;User Interfaces may get affected when using friendly &lt;strong&gt;URL routing&lt;/strong&gt; and &lt;strong&gt;mapping&lt;/strong&gt;. URL routing or mapping could shorten URL, as you can see in browsers. A route is a pattern for a URL. It includes named fragments automatically parsed from the URL into the parameter map. Every URL parsed by a route could also be generated from the resulting parameter map. Abstracted from the book: &lt;a href="https://www.packtpub.com/liferay-user-interface-development/book"&gt;Liferay User Interface Development.&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;In addition, the portal is integrated with UrlRewrite filter. Based on the mod_rewrite for apache, UrlRewrite filter is a Java Web Filter for any J2EE compliant web application server, such as Resin, Orion, or Tomcat, which allows us to rewrite URLs before they get to the code. Refer to http://tuckey.org/urlrewrite/. Performance on the UrlRewrite filter is very good and the UrlRewrite filter allows for convenient configuration of URLs where JkMount is pointing to /* or the web server isn't running behind Apache. Abstracted from the book: &lt;a href="http://www.amazon.com/Liferay-Portal-6-Enterprise-Intranets/dp/1849510385"&gt;Liferay Portal 6 Enterprise Intranets&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In brief, Liferay provides friendly URL framework and integrate UrlRewrite filter. This article will consider more specific use cases.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use case A&lt;/strong&gt;: home URL for each web site should be configurable; and hide home URL when hitting domain name only;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case B&lt;/strong&gt;: keep existing web content SEO friendly URL AS IS; when hitting these web content friendly URL, display that web content without redirecting behaviors;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case C&lt;/strong&gt;: provide new configurable SEO friendly URL for newly created web content; when hitting these web content friendly URL, display that web content without redirecting behaviors;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This article is going to show how to implement above use cases as new features in Liferay 6.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Configurable home URL&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;For the &lt;strong&gt;use case A&lt;/strong&gt;, considering scenario: there is one portal instance, two groups (either communities or organizations): street and workshop. Each group has its own virtual host like &lt;strong&gt;street.bookpub.com&lt;/strong&gt;, &lt;strong&gt;workshop.bookpub.com.&lt;/strong&gt; Each group has its own public pages and private pages.&lt;/p&gt;&lt;p&gt;For example, the group &lt;strong&gt;&lt;em&gt;street&lt;/em&gt;&lt;/strong&gt; has following page structure&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Home&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Demo&lt;br /&gt;Resource&lt;br /&gt;Help&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;And each page has its own friendly URL like &lt;em&gt;&lt;strong&gt;/home, /resource, /help, /test, /demo&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;For instance, the group &lt;strong&gt;&lt;em&gt;workshop&lt;/em&gt;&lt;/strong&gt; has following page structure&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;Help&lt;br /&gt;Resource&lt;br /&gt;Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Demo&lt;br /&gt;Home&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;And each page has its own friendly URL like &lt;strong&gt;&lt;em&gt;/help, /resource, /home, /test, /demo&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Requirements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Set home URL globally &amp;ndash; scoped to portal-instance, like &lt;strong&gt;&lt;em&gt;/test&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;When hit URL: &lt;em&gt;&lt;strong&gt;http: //street.bookpub.com[/]&lt;/strong&gt;&lt;/em&gt;, it should show the page &lt;strong&gt;&lt;em&gt;/test&lt;/em&gt;&lt;/strong&gt; of the group &lt;strong&gt;&lt;em&gt;street&lt;/em&gt;&lt;/strong&gt;;&lt;/li&gt;&lt;li&gt;No redirect in the picture; that is, the URL &lt;em&gt;&lt;strong&gt;http: //street.bookpub.com[/] &lt;/strong&gt;&lt;/em&gt;stays non-changed.&lt;/li&gt;&lt;li&gt;When hit URL: &lt;strong&gt;&lt;em&gt;http: //workshop.bookpub.com[/]&lt;/em&gt;&lt;/strong&gt;, it should show the page /test of the group &lt;strong&gt;workshop&lt;/strong&gt;;&lt;/li&gt;&lt;li&gt;Again there is no redirect in the picture; that is, the URL &lt;em&gt;&lt;strong&gt;http: //workshop.bookpub.com[/]&lt;/strong&gt;&lt;/em&gt; stays AS&amp;nbsp;IS.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Is this useful use case?&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Web content SEO friendly URL &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;For the &lt;strong&gt;use cases B&lt;/strong&gt; and &lt;strong&gt;C&lt;/strong&gt;, considering scenario, there are thousands press release articles got released in past ten years. Each article has its own SEO friendly URL, like &lt;a href="http://newsroom.cisco.com/dlls/2011/prod_030311c.html"&gt;http://street.bookpub.com/dlls/2011/prod_030311c.html&lt;/a&gt;.&amp;nbsp; The URL has following pattern.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;http://street.bookpub.com/dlls/${year}/${title.name}.html&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Where &lt;em&gt;&lt;strong&gt;${year}&lt;/strong&gt;&lt;/em&gt; stands for the value of the year, like 2011; &lt;strong&gt;${title.name}&lt;/strong&gt; stands for SEO friendly title, created by editorials. The title will take characters &lt;em&gt;&lt;strong&gt;a-z, A-Z, 0-9, and &amp;ldquo; -_.&amp;rdquo;&lt;/strong&gt;&lt;/em&gt;&amp;nbsp; (empty space, hyphen, underscore, period).&lt;/p&gt;&lt;p&gt;Now it is time to use Liferay WCM to manage all press release articles, while all SEO friendly URLs should get supported AS IS.&lt;/p&gt;&lt;p&gt;Similarly, manage features, videos and pod casts in WCM of Liferay as well.&amp;nbsp; After migration, new press release articles, features, video and pod casts will have new friendly URLs with following pattern.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;http://street.bookpub.com/${type.name}/${id.value}/${title.name}&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Where &lt;em&gt;&lt;strong&gt;{type.name}&lt;/strong&gt;&lt;/em&gt; could have values: release, feature, video, and podcast; &lt;strong&gt;${id.value}&lt;/strong&gt; presents article ID value; &lt;strong&gt;${title.name}&lt;/strong&gt; stands for SEO friendly URL&amp;nbsp;title, created by editorials.&lt;/p&gt;&lt;p&gt;And set the list of article types, for example:&lt;/p&gt;&lt;p&gt;&lt;em&gt;journal.article.types=announcements,blogs,general,news,release,feature,video,podcast &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Are these useful use cases?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Solution proposals&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add following properties&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;## Home URL enabled or disabled&lt;br /&gt;virtual.host.home.url.enabled=true&lt;br /&gt;&lt;br /&gt;## Default home URL value. It will be used only if the property&lt;br /&gt;## virtual.host.home.url.enabled is true, and home URL in Control Panel&lt;br /&gt;## settings has value NULL. &lt;br /&gt;## That is, home URL value could be reset in Control Panel&lt;br /&gt;virtual.host.home.url.name=/test&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Implement home URL as new feature.&lt;/li&gt;&lt;li&gt;Implement web content friendly URL as new feature&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Testing results&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;home URL for &lt;em&gt;&lt;strong&gt;street.bookpub.com&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="236" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=24098b95-1c89-4ad8-a28e-0751c2f4007b&amp;amp;groupId=31578&amp;amp;t=1299635216126" alt="" /&gt;&lt;/p&gt;&lt;p&gt;home URL for &lt;em&gt;&lt;strong&gt;workshop.bookpub.com&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="204" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=c2b20ca4-48e1-4cd2-ac69-10f3628decdb&amp;amp;groupId=31578&amp;amp;t=1299635216125" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Web content existing friendly URL&lt;/p&gt;&lt;p&gt;&lt;img height="202" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=75fb56dd-d020-456c-ada2-b441ac872d7c&amp;amp;groupId=31578&amp;amp;t=1299635216131" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Web content SEO friendly URL&lt;/p&gt;&lt;p&gt;&lt;img height="165" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=52d8f276-d964-44fb-a487-bf65aa317aaf&amp;amp;groupId=31578&amp;amp;t=1299635216130" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Summary&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, Liferay could be used as a framework to present any kind of SEO friendly URL. For testing purpose, these features would be available as a fix patch for Liferay 6.0.&lt;/p&gt;&lt;p&gt;Last but not least, I'd like to send special thanks to Eduardo Carneiro, Rommel Bermudez, Duncan McKeever, Mark Wynne who provided these requirements.&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-03-08T20:06:00Z</dc:date>
  </entry>
  <entry>
    <title>Applying jQuery 1.5 and UI 1.8.9 in Liferay 6.1</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-jquery-1-5-and-ui-1-8-9-in-liferay-6-1" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-jquery-1-5-and-ui-1-8-9-in-liferay-6-1</id>
    <updated>2011-02-14T17:05:47Z</updated>
    <published>2011-02-13T16:02:44Z</published>
    <summary type="html">&lt;p&gt;&lt;strong&gt;jQuery 1.5&lt;/strong&gt; updates on both &lt;strong&gt;jQuery Core&lt;/strong&gt; and &lt;strong&gt;UI&lt;/strong&gt;. This release included many &lt;strong&gt;performance improvements&lt;/strong&gt; and bug fixes as well as a major re-write of the Ajax module which now comes with deferred callback management. jQuery Core also introduced a new feature called&lt;strong&gt; jQuery.sub&lt;/strong&gt; which allows for new copies of jQuery to be created where properties and methods can be safely modified without affecting the global jQuery object. Refer to &lt;a href="http://jquery.com/"&gt;http://jquery.com/&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In previous blogs posts, following topics have beed addressed.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-jquery-and-its-custom-ui-in-liferay-6-plugins"&gt;Applying Query 1.4.3 and its custom UI 1.8.5 in Liferay 6 plugins&lt;/a&gt;,&lt;/li&gt;&lt;li&gt;&lt;a href="../../../../../web/nathan.cavanaugh/blog/-/blogs/using-jquery-or-any-javascript-library-in-liferay-6-0"&gt;Using jQuery (or any Javascript library) in Liferay 6.0&lt;/a&gt; (thanks to &lt;a href="http://www.liferay.com/web/nathan.cavanaugh/profile"&gt;Nate&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="../../../../../web/jonas.yuan/blog/-/blogs/building-jquery-based-plugins-in-liferay-6?_33_redirect=%2fweb%2fjonas.yuan%2fblog%3fp_p_id%3d33%26p_p_lifecycle%3d0%26p_p_state%3dnormal%26p_p_mode%3dview%26p_p_col_id%3dcolumn-2%26p_p_col_count%3d1%26_33_struts_action%3d%252Fblogs%252Fsearch%26_33_redirect%3d%252Fweb%252Fjonas.yuan%252Fblog%26_33_groupId%3d31578%26_33_keywords%3djQuery"&gt;Building jQuery based plugins in Liferay 6&lt;/a&gt;,&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This post will address how to apply jQuery 1.5 and UI 1.8.9 in liferay 6.1 (at revision 72877 - this is the development version, it will become in the future the next version of Liferay portal).&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;UI 1.8.9 (with jQuery 1.5) is much same as that of UI 1.8.5 in Liferay 6.0.&lt;/p&gt;&lt;p&gt;The following are a few screenshots.&lt;br /&gt;&lt;img height="244" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=7545c60f-0c59-437f-b840-028dedb0685b&amp;amp;groupId=31578&amp;amp;t=1297614416183" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="212" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=0564812b-0670-4bd8-8de1-dbbcc204cd3b&amp;amp;groupId=31578&amp;amp;t=1297614416181" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="102" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=06936474-967c-4128-b8ff-db03c2554ce8&amp;amp;groupId=31578&amp;amp;t=1297614416180" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="249" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=7278fbe2-d092-4730-afc2-9cf70ba56f8e&amp;amp;groupId=31578&amp;amp;t=1297614416178" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="157" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=bb6755f7-02ea-4fa3-b1b2-86d20ea8de8c&amp;amp;groupId=31578&amp;amp;t=1297614416177" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="153" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=d1640308-dbc6-4c54-85e5-86b33a2d963a&amp;amp;groupId=31578&amp;amp;t=1297614416176" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="211" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=b091bba1-92e6-43f6-84d8-6e7977cca3e9&amp;amp;groupId=31578&amp;amp;t=1297616138778" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;How to achieve this?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The way to apply jQuery 1.5 and UI 1.8.9 in Liferay 6.1 is almost same as that of&amp;nbsp;&amp;nbsp; jQuery 1.4.* and UI 1.8.5 in Liferay 6.0. The following items show differences&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use DTD 6.1&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;liferay-portlet.xml &lt;br /&gt;&lt;em&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE liferay-portlet-app PUBLIC &amp;quot;-//Liferay//DTD Portlet Application 6.1.0//EN&amp;quot; &amp;quot;http://www.liferay.com/dtd/liferay-portlet-app_6_1_0.dtd&amp;quot;&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;liferay-display.xml.&lt;br /&gt;&lt;em&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE display PUBLIC &amp;quot;-//Liferay//DTD Display 6.1.0//EN&amp;quot; &amp;quot;http://www.liferay.com/dtd/liferay-display_6_1_0.dtd&amp;quot;&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;apply jquery 1.5 and UI 1.8.9 in liferay-portlet.xml&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&amp;lt;portlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;portlet-name&amp;gt;1&amp;lt;/portlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;icon&amp;gt;/images/world.png&amp;lt;/icon&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;header-portlet-css&amp;gt;/css/ui-lightness/jquery-ui-1.8.9.custom.css&amp;lt;/header-portlet-css&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;header-portlet-javascript&amp;gt;/js/jquery-1.5.min.js&amp;lt;/header-portlet-javascript&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;footer-portlet-javascript&amp;gt;/js/jquery-ui-1.8.9.custom.min.js&amp;lt;/footer-portlet-javascript&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;css-class-wrapper&amp;gt;sample-jquery-portlet&amp;lt;/css-class-wrapper&amp;gt;&lt;br /&gt;&amp;lt;/portlet&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;You can simply download WAR of &lt;em&gt;Sample jQuery 1.5 and UI 1.8.9&lt;/em&gt; plugin.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://www.liferay.com/c/document_library/get_file?uuid=a8a32e5e-44a3-4cac-aaa2-491fd3f411f8&amp;amp;groupId=31578"&gt;Liferay 6.1: sample-jquery-portlet-6.1.0.1.war&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;And then deploy it in Liferay 6.1.&lt;/p&gt;&lt;p class="MsoNormal"&gt;Of course, you can test the same at Liferay 6.0.&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a href="http://www.liferay.com/c/document_library/get_file?uuid=7fe3694a-71a6-401b-8a31-62ded7dffcf8&amp;amp;groupId=31578"&gt;Liferay 6.0: sample-jquery-portlet-6.0.5.1.war&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;That's it.&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-02-13T16:02:44Z</dc:date>
  </entry>
  <entry>
    <title>Bringing data type BigDecimal into Service-Builder</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/bringing-data-type-bigdecimal-into-service-builder" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/bringing-data-type-bigdecimal-into-service-builder</id>
    <updated>2011-02-11T05:30:46Z</updated>
    <published>2011-02-10T22:07:55Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;Any application dealing with currency should really use the Java class &lt;strong&gt;BigDecimal&lt;/strong&gt;. &amp;nbsp;BigDecimal - &lt;em&gt;java.math.BigDecimal&lt;/em&gt; - immutable, arbitrary-precision signed decimal numbers. A BigDecimal consists of an arbitrary precision integer unscaled value and a 32-bit integer scale. If zero or positive, the scale is the number of digits to the right of the decimal point. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale. The value of the number represented by the BigDecimal is therefore (unscaledValue &amp;times; 10&lt;sup&gt;-scale&lt;/sup&gt;).&amp;nbsp;The BigDecimal class provides operations for arithmetic, scale manipulation, rounding, comparison, hashing, and format conversion. &amp;nbsp;&lt;/p&gt;&lt;p&gt;Request for &lt;a href="http://issues.liferay.com/browse/LEP-841"&gt;support of BigDecimal in Service-Builder&lt;/a&gt; has been there for around many years. Now it is time to implement. right?&amp;nbsp;Service-builder supports following Java data types and database data types mapping.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;boolean =&amp;gt; BOOLEAN&lt;/li&gt;&lt;li&gt;int, Integer, short =&amp;gt; INTEGER&lt;/li&gt;&lt;li&gt;long =&amp;gt; LONG&lt;/li&gt;&lt;li&gt;float, double =&amp;gt; DOUBLE&lt;/li&gt;&lt;li&gt;String =&amp;gt; VARCHAR (&amp;lt;4000), STRING (=4000), TEXT (&amp;gt;4000)&lt;/li&gt;&lt;li&gt;Date =&amp;gt; DATE&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Supported primitive types include &amp;ldquo;boolean&amp;rdquo;, &amp;ldquo;int&amp;rdquo;, &amp;ldquo;short&amp;rdquo;, &amp;ldquo;long&amp;rdquo;, &amp;ldquo;float&amp;rdquo; and &amp;ldquo;double&amp;rdquo;; and data types &amp;ldquo;String&amp;rdquo; and &amp;ldquo;Date&amp;rdquo; got supported , too. The previous &lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-convert-null-attribute-in-service-builder-to-persist-null-and-not-null-into-data-types-in-databases"&gt;blogs post&lt;/a&gt; discussed how to apply convert-null element on primitive types.&amp;nbsp;This article will address how to bring data type BigDecimal into Service-Builder.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium"&gt;An example&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Consider following service.xml.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!DOCTYPE service-builder PUBLIC &amp;quot;-//Liferay//DTD Service Builder 6.1.0//EN&amp;quot; &amp;quot;http://www.liferay.com/dtd/liferay-service-builder_6_1_0.dtd&amp;quot;&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;service-builder package-path=&amp;quot;com.liferay.sampleservicebuilder&amp;quot;&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;namespace&amp;gt;SSB&amp;lt;/namespace&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;entity name=&amp;quot;Foo&amp;quot; uuid=&amp;quot;true&amp;quot; local-service=&amp;quot;true&amp;quot; remote-service=&amp;quot;true&amp;quot;&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- PK fields --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;fooId&amp;quot; type=&amp;quot;long&amp;quot; primary=&amp;quot;true&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- Group instance --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;groupId&amp;quot; type=&amp;quot;long&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- Audit fields --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;companyId&amp;quot; type=&amp;quot;long&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;userId&amp;quot; type=&amp;quot;long&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;userName&amp;quot; type=&amp;quot;String&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;createDate&amp;quot; type=&amp;quot;Date&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;modifiedDate&amp;quot; type=&amp;quot;Date&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- Other fields --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field1&amp;quot; type=&amp;quot;String&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field2&amp;quot; type=&amp;quot;boolean&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field3&amp;quot; type=&amp;quot;int&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field4&amp;quot; type=&amp;quot;Date&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field5&amp;quot; type=&amp;quot;String&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field6&amp;quot; type=&amp;quot;BigDecimal&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field7&amp;quot; type=&amp;quot;BigDecimal&amp;quot; constraint-precision=&amp;quot;8&amp;quot; constraint-scale=&amp;quot;3&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;field8&amp;quot; type=&amp;quot;BigDecimal&amp;quot; constraint-precision=&amp;quot;10&amp;quot; constraint-scale=&amp;quot;4&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- Order --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;order by=&amp;quot;asc&amp;quot;&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;order-column name=&amp;quot;field1&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;/order&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- Finder methods --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;finder name=&amp;quot;Field2&amp;quot; return-type=&amp;quot;Collection&amp;quot;&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;finder-column name=&amp;quot;field2&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;/finder&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;!-- References --&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;reference package-path=&amp;quot;com.liferay.portlet.asset&amp;quot; entity=&amp;quot;AssetEntry&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;reference package-path=&amp;quot;com.liferay.portlet.asset&amp;quot; entity=&amp;quot;AssetTag&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;/entity&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: xx-small"&gt;&lt;em&gt;&amp;lt;/service-builder&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;As shown in above code, columns &amp;ldquo;field6&amp;rdquo;, &amp;ldquo;field7&amp;rdquo;, &amp;ldquo;field8&amp;rdquo; have data type &amp;ldquo;BigDecimal&amp;rdquo; and columns &amp;ldquo;field7&amp;rdquo; and &amp;ldquo;field8&amp;rdquo; have constraint precision (8, 10) and scale (3,4).&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium"&gt;Solution proposal&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The following are proposed steps to support data-type &lt;strong&gt;BigDecimal&lt;/strong&gt; in Service-Builder.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add two constraint elements for the data type BigDecimal in Service-Builder DTD.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;constraint-precision&lt;/strong&gt;: M - the maximum number of digits (the precision);&lt;/p&gt;&lt;p&gt;&lt;strong&gt;constraint-scale&lt;/strong&gt;: D - the number of digits to the right of the decimal point (the scale)&lt;/p&gt;&lt;p&gt;The SQL standard requires that the precision of NUMERIC(M,D) be exactly M digits. For DECIMAL(M,D), the standard requires a precision of at least M digits but permits more. In MySQL, DECIMAL(M,D) and NUMERIC(M,D) are the same, and both have a precision of exactly M digits. &amp;nbsp;For example, column salary could be presented in database SQL as follows.&lt;/p&gt;&lt;p&gt;&lt;em&gt;salary NUMERIC(5,2)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;As shown in above code, constraint-precision has value 5 (M=5) and constraint-scale has value 2 (D=2).&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add a data type called BigDecimal in service-builder DTD&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For example, column salary could be specified in service.xml as follows.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt;column name=&amp;quot;salary&amp;quot; type=&amp;quot;BigDecimal&amp;quot; constraint-precision=&amp;rdquo;5&amp;rdquo; constraint-scale=&amp;rdquo;2&amp;rdquo; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add an object type in Liferay portal core called com.liferay.portal.dao.orm.hibernate.BigDecimalType, where specifies default value;&lt;/li&gt;&lt;li&gt;Map BigDecimal into NUMERIC(M,D) as part of SQL scripts&lt;/li&gt;&lt;li&gt;Map BigDecimal into object type com.liferay.portal.dao.orm.hibernate.BigDecimalType if convert-null is set to true; or map BigDecimal into object type org.hibernate.type.BigDecimalType, if convert-null is set to false.&lt;/li&gt;&lt;li&gt;Map BigDecimal into Java class java.math.BigDecimal when generating models and services.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In above steps, we could make data-type BigDecimal available in Service-Builder.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium"&gt;Results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Solution proposal could be presented as a fix patch. After applying this fix patch, you can generate services, models and SQL scripts with new data type BigDecimal based on above service.xml. The following are generated SQL scripts.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;create table SSB_Foo (&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;uuid_ VARCHAR(75) null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;fooId LONG not null primary key,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;groupId LONG,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;companyId LONG,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;userId LONG,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;userName VARCHAR(75) null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;createDate DATE null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;modifiedDate DATE null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field1 VARCHAR(75) null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field2 BOOLEAN,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field3 INTEGER,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field4 DATE null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field5 VARCHAR(75) null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field6 NUMERIC(5, 2) null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field7 NUMERIC(8, 3) null,&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;field8 NUMERIC(10, 4) null&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: x-small"&gt;);&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium"&gt;Summary&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, data type BigDecimal and two elements constraint-precision and constraint-scale are ready in Service-Builder. And generated services, models and SQL scripts will support data type BigDecimal as well.&amp;nbsp;&lt;/p&gt;&lt;p&gt;What&amp;rsquo;s next? Check &lt;a href="http://issues.liferay.com/browse/LPS-15136"&gt;Service-Builder improvement&lt;/a&gt;.&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-02-10T22:07:55Z</dc:date>
  </entry>
  <entry>
    <title>Integrating Alfresco 3.4 in Liferay 6.1 via CMIS 1.0</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/integrating-alfresco-3-4-in-liferay-6-1-via-cmis-1-0" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/integrating-alfresco-3-4-in-liferay-6-1-via-cmis-1-0</id>
    <updated>2011-02-01T05:59:37Z</updated>
    <published>2011-02-01T01:31:26Z</published>
    <summary type="html">&lt;p&gt;Alfresco Enterprise 3.4 delivers social content management. This new release delivers on Alfresco&amp;rsquo;s vision of providing the open platform for social content management by delivering both a more robust content platform for building any kind of content-rich application, along with a more social user-interface for collaboration and document management. Refer to &lt;a href="http://www.alfresco.com"&gt;alfresco website&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In previous blogs posts, we have discussed how to integrate Alfresco &lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/integrating-alfresco-through-cmis-in-liferay"&gt;3.2&lt;/a&gt;/&lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/alfresco-3-3-delivers-cmis-support-integration-with-liferay-6"&gt;3.3&lt;/a&gt; with Liferay 6 via CMIS. This article is going to continue the discussion of the topic - integrating Alfresco 3.4 in Liferay 6.1 via CMIS.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;How to achieve it?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You would be able to integrate Alfresco 3.4 EE via CMIS 1.0 in Liferay portal 6.1 in following steps.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Install Liferay portal 6.1 (revision 71867) at $LIFERAY_HOME; Liferay-Tomcat bundle is expressed as $TOMCAT_AS_DIR; and $PORTAL_ROOT_HOME = $TOMCAT_AS_DIR/webapps/ROOT;&lt;/li&gt;&lt;li&gt;Locate Alfresco 3.4 EE WAR ${alfresco.war} and Share WAR ${shared.war} at $ALFRESCO_INSTALLATION/ tomcat/webapps&lt;/li&gt;&lt;li&gt;Drop ${alfresco.war} and ${shared.war} to $TOMCAT_AS_DIR/webapps;&lt;/li&gt;&lt;li&gt;Create a database alfresco in MySQL.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;drop database if exists alfresco;&lt;br /&gt;create database alfresco character set utf8;&lt;br /&gt;grant all on alfresco.* to 'alfresco'@'localhost' identified by 'alfresco' with grant option;&lt;br /&gt;grant all on alfresco.* to 'alfresco'@'localhost.localdomain' identified by 'alfresco' with grant option;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Optionally, create database lportal in MySQL&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;drop database if exists lportal;&lt;br /&gt;create database lportal character set utf8;&lt;br /&gt;grant all on lportal.* to 'lportal'@'localhost' identified by 'lportal' with grant option;&lt;br /&gt;grant all on lportal.* to 'lportal'@'localhost.localdomain' identified by 'lportal' with grant option;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a file named portal-ext.properties at $PORTAL_ROOT_HOME/WEB-INF/classes and add following lines in portal-ext.properties.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;dl.hook.impl=com.liferay.documentlibrary.util.CMISHook&lt;br /&gt;cmis.credentials.username=admin&lt;br /&gt;cmis.credentials.password=admin&lt;br /&gt;cmis.repository.url=http://localhost:8080/alfresco/service/api/cmis&lt;br /&gt;cmis.repository.version=1.0&lt;br /&gt;cmis.system.root.dir=Liferay Home&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Especially you may install Alfresco 3.4 in different server, call virtual server. In this case, you need to update cmis.repository.url as follows&lt;/p&gt;&lt;p&gt;&lt;em&gt;cmis.repository.url=http://${domain.name}:${port.number}/alfresco/service/api/cmis&lt;/em&gt;&lt;/p&gt;&lt;p&gt;In addition, you may have different admin account in alfresco. Thus you need to update &lt;em&gt;cmis.credentials.username and cmis.credentials.password.&lt;br /&gt;cmis.credentials.username=${admin.name}&lt;br /&gt;cmis.credentials.password=${admin.password}&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Optionally, add database connection in portal-ext.properties.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;## MySQL&lt;br /&gt;jdbc.default.driverClassName=com.mysql.jdbc.Driver&lt;br /&gt;jdbc.default.url=jdbc:mysql://localhost:3306/lportal?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;useFastDateParsing=false&lt;br /&gt;jdbc.default.username=lportal&lt;br /&gt;jdbc.default.password=lportal&lt;/em&gt;&lt;br /&gt;Of course, you can use different database systems.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Start the portal&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of course, you can get the latest WAR of Alfresco Community version or Enterprise (Trial) version from Alfresco website&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.alfresco.com/try/"&gt;http://www.alfresco.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Testing by examples&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In Control panel of Liferay portal, select default community &amp;ldquo;liferay.com&amp;rdquo;; and going to Content-&amp;gt;Document Library, upload two documents (pdf and ppt, for example) as shown in following screenshot.&lt;/p&gt;&lt;p&gt;&lt;img height="381" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=60d66a04-c097-40fc-92bf-36bdec7f141c&amp;amp;groupId=31578&amp;amp;t=1296525054113" /&gt;&lt;/p&gt;&lt;p&gt;Then logging in to Alfresco as &amp;quot;admin/admin&amp;quot;, you would see the folder &amp;quot;Liferay Home&amp;quot; and documents as shown in following screenshot. That is, Alfresco becomes direct repository of Liferay Document Library via CMIS. All real content is stored in Alfresco, while all metadata is stored in Liferay database.&lt;/p&gt;&lt;p&gt;&lt;img height="330" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=b5df593c-040c-467c-bcb2-b56a8f9ba54f&amp;amp;groupId=31578&amp;amp;t=1296525054113" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Open issues and new features&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;One known open issue is &lt;a href="http://issues.liferay.com/browse/LPS-12406"&gt;LPS-12406&lt;/a&gt; - CMIS hook conflicts with plugins hooks. It will get fixed shortly.&lt;/p&gt;&lt;p&gt;And good news &amp;ndash; Liferay 6.1 will allow Liferay to act as a CMIS producer, including CMIS Producer support for WCM (&lt;a href="http://issues.liferay.com/browse/LPS-10201"&gt;LPS-10201&lt;/a&gt;); and CMIS consumer Support (&lt;a href="http://issues.liferay.com/browse/LPS-13160"&gt;LPS-13160&lt;/a&gt;) - a ton of thanks to &lt;a href="https://www.liferay.com/web/alexander.chow/profile"&gt;Alex&lt;/a&gt;.&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-02-01T01:31:26Z</dc:date>
  </entry>
  <entry>
    <title>Applying convert-null attribute in Service Builder to persist NULL and NOT NULL into data types in databases</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-convert-null-attribute-in-service-builder-to-persist-null-and-not-null-into-data-types-in-databases" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-convert-null-attribute-in-service-builder-to-persist-null-and-not-null-into-data-types-in-databases</id>
    <updated>2011-01-22T19:41:12Z</updated>
    <published>2011-01-22T00:11:25Z</published>
    <summary type="html">&lt;p&gt;Service Builder is a cool tool to automate the creation of interfaces and implementation classes for database persistence, local services and remote services, like find, create, update, and delete operations on the database. In general, the Service Builder is a code generator. Using an XML descriptor, it generates:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Java Beans&lt;/li&gt;&lt;li&gt;SQL scripts for database tables creation;&lt;/li&gt;&lt;li&gt;Hibernate Configuration;&lt;/li&gt;&lt;li&gt;Spring Configuration;&lt;/li&gt;&lt;li&gt;Axis Web Services and&lt;/li&gt;&lt;li&gt;JSON JavaScript Interface&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The service classes include persistence services, local services, remote services, models and their implementation classes. The service builder supports following data types and database data types mapping.&lt;/p&gt;&lt;p&gt;Data types&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Database data types&lt;/p&gt;&lt;p&gt;boolean&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOLEAN&lt;br /&gt;int, Integer, short &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER&lt;br /&gt;long&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG&lt;br /&gt;float, double&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOUBLE&lt;br /&gt;String&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VARCHAR (&amp;lt;4000), STRING (=4000), TEXT (&amp;gt;4000)&lt;br /&gt;Date&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATE&lt;/p&gt;&lt;p&gt;Supported primitive types include &amp;ldquo;boolean&amp;rdquo;, &amp;ldquo;int&amp;rdquo;, &amp;ldquo;short&amp;rdquo;, &amp;ldquo;long&amp;rdquo;, &amp;ldquo;float&amp;rdquo; and &amp;ldquo;double&amp;rdquo;; and data types &amp;ldquo;String&amp;rdquo; and &amp;ldquo;Date&amp;rdquo; got supported , too.&lt;/p&gt;&lt;p&gt;Default value of above data types could be NULL or specific value. Thanks to Brian who introduced &amp;ldquo;&lt;strong&gt;convert-null&lt;/strong&gt;&amp;rdquo; element in service builder (&lt;b&gt;&lt;a id="issue_key_LEP-1353" href="http://issues.liferay.com/browse/LEP-1353"&gt;LEP-1353&lt;/a&gt;&lt;/b&gt; - Add convert-null element to service generator). The convert-null value specifies whether or not the column value is automatically converted to a non null value if it is null. Currently (revision 71166) this feature only applies if the type value is String. This is particularly useful if your entity is referencing a read only table or a database view so that Hibernate does not try to issue unnecessary updates. The default setting of this convert-null attribute is true.&lt;/p&gt;&lt;p&gt;This article will address how to apply convert-null element on other data types like primitive types. For example, you may expect Long value and Integer value to be null value to table, rather than value 0. Mostly importantly you may need option to save Long value and Integer value either null or 0. Specially, following two use cases will be covered.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use case A&lt;/strong&gt;: default non-NULL values for primitive types, String and Date&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case B&lt;/strong&gt;: default NULL value for primitive types, String and Date.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;An example&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Consider following XML in &lt;strong&gt;service.xml&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;em&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE service-builder PUBLIC &amp;quot;-//Liferay//DTD Service Builder 6.0.0//EN&amp;quot; &amp;quot;http://www.liferay.com/dtd/liferay-service-builder_6_0_0.dtd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;service-builder package-path=&amp;quot;com.liferay.sampleservicebuilder&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;namespace&amp;gt;SSB&amp;lt;/namespace&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entity name=&amp;quot;Foo&amp;quot; uuid=&amp;quot;true&amp;quot; local-service=&amp;quot;true&amp;quot; remote-service=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- PK fields --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fooId&amp;quot; type=&amp;quot;long&amp;quot; primary=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Group instance --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;groupId&amp;quot; type=&amp;quot;long&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Audit fields --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;companyId&amp;quot; type=&amp;quot;long&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;userId&amp;quot; type=&amp;quot;long&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;userName&amp;quot; type=&amp;quot;String&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;createDate&amp;quot; type=&amp;quot;Date&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;modifiedDate&amp;quot; type=&amp;quot;Date&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Other fields --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field0&amp;quot; type=&amp;quot;Integer&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field1&amp;quot; type=&amp;quot;String&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field2&amp;quot; type=&amp;quot;boolean&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field3&amp;quot; type=&amp;quot;int&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field4&amp;quot; type=&amp;quot;Date&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field5&amp;quot; type=&amp;quot;String&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field6&amp;quot; type=&amp;quot;long&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field7&amp;quot; type=&amp;quot;long&amp;quot; convert-null=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field8&amp;quot; type=&amp;quot;short&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;field9&amp;quot; type=&amp;quot;short&amp;quot; convert-null=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fieldA&amp;quot; type=&amp;quot;int&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fieldB&amp;quot; type=&amp;quot;boolean&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fieldC&amp;quot; type=&amp;quot;float&amp;quot; convert-null=&amp;quot;true&amp;quot; /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fieldD&amp;quot; type=&amp;quot;float&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fieldE&amp;quot; type=&amp;quot;double&amp;quot; convert-null=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;fieldF&amp;quot; type=&amp;quot;double&amp;quot; convert-null=&amp;quot;false&amp;quot; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Order --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;order by=&amp;quot;asc&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;order-column name=&amp;quot;field1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/order&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/entity&amp;gt;&lt;br /&gt;&amp;lt;/service-builder&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As shown in above code, it expects default value of &amp;ldquo;field0&amp;rdquo;, &amp;ldquo;field5&amp;rdquo;, &amp;ldquo;field6&amp;rdquo;, &amp;ldquo;field8&amp;rdquo;, &amp;ldquo;fieldA&amp;rdquo;, &amp;ldquo;fieldB&amp;rdquo;, &amp;ldquo;fieldD&amp;rdquo; and &amp;ldquo;fieldF&amp;rdquo; should be NULL. And for the rest, convert NULL value of String to &amp;ldquo;&amp;rdquo;, convert null value of Boolean to false, convert NULL value of Integer, Short and Long to 0; convert NULL value of Float to 0.0F; convert NULL value of Double to 0.0D. Especially, data type Date always has default value NULL.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Solution - applying convert-null element on data types&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Above requirements can be satisfied by following two steps.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mapping covert-null value into database SQL.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;for example, generated SQL table:&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-small;"&gt;&lt;em&gt;create table SSB_Foo (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uuid_ VARCHAR(75) null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fooId LONG not null primary key,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; groupId LONG,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; companyId LONG,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; userId LONG,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; userName VARCHAR(75) null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; createDate DATE null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; modifiedDate DATE null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field0 INTEGER null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field1 VARCHAR(75) null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field2 BOOLEAN,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field3 INTEGER,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field4 DATE null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field5 VARCHAR(75) null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field6 LONG null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field7 LONG,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field8 INTEGER null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; field9 INTEGER,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldA INTEGER null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldB BOOLEAN null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldC DOUBLE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldD DOUBLE null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldE DOUBLE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldF DOUBLE null&lt;br /&gt;);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mapping column-types with &lt;strong&gt;&lt;em&gt;convert-null=&amp;quot;false&amp;quot;&lt;/em&gt;&lt;/strong&gt; into different ORM&amp;nbsp;object types with default value NULL.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By default, Liferay has provided following ORM&amp;nbsp;object types with default non-null value.&lt;/p&gt;&lt;p&gt;&lt;em&gt;ShortType &amp;ndash; mapped into data type short - default value 0&lt;br /&gt;IntegerType - mapped into data type int - default value 0&lt;br /&gt;LongType - mapped into data type long - default value 0&lt;br /&gt;BooleanType - mapped into data type boolean - default value false&lt;br /&gt;FloatType - mapped into data type float - default value 0.0f&lt;br /&gt;DoubleType - mapped into data type double - default value 0.0D&lt;/em&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves /&gt;
  &lt;w:TrackFormatting /&gt;
  &lt;w:PunctuationKerning /&gt;
  &lt;w:ValidateAgainstSchemas /&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF /&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables /&gt;
   &lt;w:SnapToGridInCell /&gt;
   &lt;w:WrapTextWithPunct /&gt;
   &lt;w:UseAsianBreakRules /&gt;
   &lt;w:DontGrowAutofit /&gt;
   &lt;w:SplitPgBreakAndParaMark /&gt;
   &lt;w:DontVertAlignCellWithSp /&gt;
   &lt;w:DontBreakConstrainedForcedTables /&gt;
   &lt;w:DontVertAlignInTxbx /&gt;
   &lt;w:Word11KerningPairs /&gt;
   &lt;w:CachedColBalance /&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math" /&gt;
   &lt;m:brkBin m:val="before" /&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
   &lt;m:smallFrac m:val="off" /&gt;
   &lt;m:dispDef /&gt;
   &lt;m:lMargin m:val="0" /&gt;
   &lt;m:rMargin m:val="0" /&gt;
   &lt;m:defJc m:val="centerGroup" /&gt;
   &lt;m:wrapIndent m:val="1440" /&gt;
   &lt;m:intLim m:val="subSup" /&gt;
   &lt;m:naryLim m:val="undOvr" /&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;/p&gt;&lt;p&gt;That is, introduce new mapping feature in Service Builder that it would have capabilities to map column types into above ORM object types only if convert-null=&amp;quot;false&amp;quot; was not set on columns.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Testing Results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;After applying new mapping feature in Service Builder, building service based on above &lt;strong&gt;service.xml&lt;/strong&gt;, deploying portlet and adding new row, you would see NULL value was add as default for the columns with setting convert-null=&amp;quot;false&amp;quot;. More exactly,&amp;nbsp; default value of &amp;ldquo;field0&amp;rdquo;, &amp;ldquo;field5&amp;rdquo;, &amp;ldquo;field6&amp;rdquo;, &amp;ldquo;field8&amp;rdquo;, &amp;ldquo;fieldA&amp;rdquo;, &amp;ldquo;fieldB&amp;rdquo;, &amp;ldquo;fieldD&amp;rdquo;, and &amp;ldquo;fieldF&amp;rdquo; is NULL, persisted in databases.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;convert-null&lt;/strong&gt; value specifies whether or not the column value is automatically converted to a non null value if it is null (&lt;strong&gt;Use case A&lt;/strong&gt; and &lt;strong&gt;Use case B&lt;/strong&gt;) in Service Builder. This feature applies if the type value is &lt;strong&gt;String&lt;/strong&gt; or primitive types like &lt;strong&gt;int&lt;/strong&gt;, &lt;strong&gt;short&lt;/strong&gt;, &lt;strong&gt;long&lt;/strong&gt;, &lt;strong&gt;boolean&lt;/strong&gt;, &lt;strong&gt;float&lt;/strong&gt; and &lt;strong&gt;double&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;By the way, this feature will be available for 6.1 (&lt;b&gt;&lt;a id="issue_key_LPS-14863" href="http://issues.liferay.com/browse/LPS-14863"&gt;LPS-14863&lt;/a&gt;&lt;/b&gt; - applying convert-null element to service generator). Definitely this feature could be available for 5.2 and 6.0 as a fix patch.&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-01-22T00:11:25Z</dc:date>
  </entry>
  <entry>
    <title>Applying LAR and remote publishing capabilities on custom assets in Plugins</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-lar-and-remote-publishing-capabilities-on-custom-assets-in-plugins" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-lar-and-remote-publishing-capabilities-on-custom-assets-in-plugins</id>
    <updated>2011-01-15T01:28:35Z</updated>
    <published>2011-01-05T16:49:33Z</published>
    <summary type="html">&lt;p&gt;Liferay portal provides remote staging and publishing capability through which the users can select subsets of pages and data (both portal core assets and custom assets), and transfer them to the live site&amp;mdash;that is, remote portal instance. Using this, we can export the selected data to the group of a remote portal instance or to another group in same portal instance.&lt;/p&gt;&lt;p&gt;The LAR exporting and importing features are used for remote staging and publishing. These features are implemented in the PortletDataHandler API. The intent of this API is to provide the portal core assets and custom assets with a useful API for importing and exporting application content to and from the portal in a database agnostic fashion. Abstracted from the book: &lt;a href="http://www.amazon.com/Liferay-Portal-5-2-Systems-Development/dp/1847194702/"&gt;Liferay Portal 5.2 Systems Development&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In addtion, the portal integrates workflow systems like jBPM or Kaleo on any assets, either core assets or custom assets; the portal provides a framework to add custom attributes or called custom fields to any Service-Builder generated entities at runtime, where indexed values, text boxes, and selection lists for input and dynamic UI are available; OpenSocial, Social Activity and Social Equity are available in Plugins; and CAPTCHA or reCAPTCHA would be available for custom assets; etc. As mentioned in following blogs posts, these features have been applied on custom assets in plugins.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/integrating-captcha-or-recaptcha-with-custom-assets-through-plugins"&gt;Integrating CAPTCHA or reCAPTCHA with custom assets through plugins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/adding-social-equity-services-on-custom-assets-through-plugins"&gt;Adding Social Equity services on custom assets through plugins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/adding-custom-attributes-capabilities-on-custom-assets-in-liferay-6-through-plugins"&gt;Adding Custom Attributes capabilities on custom assets in Liferay 6 through plugins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/how-to-add-workflow-capabilities-on-knowledge-base-articles-or-any-custom-assets-in-plugins"&gt;How to add workflow capabilities on Knowledge Base articles or any custom assets in plugins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.liferay.com/web/jonas.yuan/blog/-/blogs/applying-workflow-on-custom-assets-in-liferay-6-through-plugins"&gt;Applying workflow on custom assets in Liferay 6 through plugins&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When applying LAR and remote publishing capabilities on custom assets, following use cases come into picture.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use case A&lt;/strong&gt;: ability to archive custom assets, for example, Knowledge Base articles.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case B&lt;/strong&gt;: ability to publish custom assets from staging to live remotely.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This article will address how to implement LAR and remote publishing capabilities on custom assets, for example knowledge base articles, in plugins. Of course, you can leverage the same mechanism to apply LAR and remote publishing capabilities on your own custom assets.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;LAR &amp;ndash; import and export&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Data export and import generally revolve around the concept of storing data outside the portal permanently or temporarily. The portal does this by handling the creation and interpretation of the LAR files. The functions of data export and import are portlet-wise. Following screenshot shows capabilities to import and export Knowledge base articles.&lt;/p&gt;&lt;p&gt;&lt;img height="155" width="660" alt="" src="http://www.liferay.com/image/image_gallery?uuid=10e396e5-2259-4185-84ae-b6334bec83b3&amp;amp;groupId=31578&amp;amp;t=1294267005433" /&gt;&lt;/p&gt;&lt;p&gt;Note that LAR is short for Liferay Archive. It includes all of the pages, their layouts, their configurations, their look and feel, their permissions, and so on. Importing a LAR file will overwrite any existing pages of a given group configured in the LAR file. And most importantly, target portal server, which is used to import LAR file, must have exactly same version as that of source portal server, which is used to export LAR file. That is, LAR should not be used for upgrade.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Custom Asset models &amp;ndash; Knowledge Base&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As shown in following figure, Knowledge Base articles are specified as entries: &lt;strong&gt;Article&lt;/strong&gt;, &lt;strong&gt;Comment&lt;/strong&gt;, and &lt;strong&gt;Template&lt;/strong&gt;. The entry Article included columns: article Id as primary key, resource Prim Key, group Id, company Id, user Id, user Name, create Date, modified Date, parent resource Prim Key, version, title, content, description, priority, and so on; the entry Template included columns: template Id as primary key, group Id, company Id, user Id, user Name, create Date, modified Date, title, content, description and so on; while the entity Comment included columns: comment Id as primary key, group Id, company Id, user Id, user Name, create Date, modified Date, class Name Id, class PK, content, helpful, and more. As you can see, the entity Comment could be applied on either any core assets or custom assets like Article and Template by using class Name Id and class PK.Sure, you can find details in &lt;em&gt;$PLUGIN_SDK_HOME/knowledge-base-portlet/docroot/WEB-INF/service.xml&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Abstracted from the book:&lt;a href="https://www.packtpub.com/liferay-user-interface-development/book"&gt; Liferay User Interface Development&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="102" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=6956530a-fbd1-4168-af7d-e01362266cb7&amp;amp;groupId=31578&amp;amp;t=1294247475376" alt="" /&gt;&lt;/p&gt;&lt;p&gt;When exporting / importing custom assets like knowledge base articles, first above models and their versions should be in picture. And moreover, following associations should be taken into account.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Attachments (as documents)&lt;/li&gt;&lt;li&gt;Documents (as links)&lt;/li&gt;&lt;li&gt;Images (if any)&lt;/li&gt;&lt;li&gt;Polls (if any)&lt;/li&gt;&lt;li&gt;Asset ratings&lt;/li&gt;&lt;li&gt;Asset view counts&lt;/li&gt;&lt;li&gt;Asset comments and votes on comments&lt;/li&gt;&lt;li&gt;Subscriptions&lt;/li&gt;&lt;li&gt;Addresses (if any)&lt;/li&gt;&lt;li&gt;Asset tags&lt;/li&gt;&lt;li&gt;Asset categories&lt;/li&gt;&lt;li&gt;Custom fields&lt;/li&gt;&lt;li&gt;Locks&lt;/li&gt;&lt;li&gt;Permissions&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Solution Overview &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Following diagram shows what&amp;rsquo;s happening to remote publish on custom assets.&amp;nbsp; Supposed that there is one staging server &amp;ndash; one Liferay installation for internal users to build and review web content, and there is one remote live server - one Liferay installation for external users to view web content. Of course, you can have more than one live servers clustered.&lt;/p&gt;&lt;p&gt;&lt;img height="232" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f8c9f19c-a148-459f-bd73-d4731972454b&amp;amp;groupId=31578&amp;amp;t=1294247475373" alt="" /&gt;&lt;/p&gt;&lt;p&gt;By the way, the portal provides capabilities to have local staging and local live, that is, the live group and the staging group exist in the same portal instance. How does it work? You can refer to the book: &lt;a href="http://www.amazon.com/Liferay-Portal-5-2-Systems-Development/dp/1847194702/" target="_blank"&gt;Liferay Portal 5.2 Systems Development&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In general, there are three-step processes to remote publish assets, both core assets and custom assets.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Export assets &amp;ndash; both core assets and custom assets &amp;ndash; as internal LAR in staging server&lt;/li&gt;&lt;li&gt;Push exported LAR from Staging to Remote Live server through tunnel-web, both staging server and remote live server&lt;/li&gt;&lt;li&gt;Import assets - both core assets and custom assets &amp;ndash; as internal LAR in remote live server;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Protecting tunnel servlet&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Of course, you need to protect tunnel servlet.&amp;nbsp; In order to communicate with the remote server and, moreover, protect HTTP connection, we need to set up a tunnel web in portal-ext.properties. That is, add the following lines at the end of portal-ext.properties:&lt;/p&gt;&lt;p&gt;&lt;em&gt;tunnel.servlet.hosts.allowed=127.0.0.1,69.198.171.104,69.198.171.105,64.71.191.145,SERVER_IP&lt;br /&gt;tunnel.servlet.https.required=false&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The preceding code shows a tunnel.servlet.hosts.allowed property with a list of allowed hosts, for example, 69.198.171.104, 69.198.171.105, and 64.71.191.145 &amp;ndash; IPs of staging server and remote live servers, replacing them with IPs of your own servers. As stated above, we used these hosts as examples only. You can have your own real hosts. Meanwhile, it specifies the tunnel.servlet.https.required property. By default, it is set as a false value. You can set it as a true value if you want to use HTTPS.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Capabilities&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Note that remote publishing function should be used to push content only &amp;ndash; both staging server and remote servers must have exactly same version. That is, remote publishing feature should not be used for upgrade.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;How to Implement LAR?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In following three steps, you should be able to implement LAR to archive knowledge base articles.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add &lt;em&gt;portlet-data-handler&lt;/em&gt; in &lt;em&gt;$PLUGIN_SDK_HOME/knowledge-base-portlet/docroot/WEB-INF/liferay-portlet.xml&lt;/em&gt; like&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&amp;lt;portlet-data-handler-class&amp;gt;com.liferay.knowledgebase.admin.lar.AdminPortletDataHandlerImpl&amp;lt;/portlet-data-handler-class&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Extend &lt;em&gt;com.liferay.portal.kernel.lar.BasePortletDataHandler&lt;/em&gt; as &lt;em&gt;com.liferay.knowledgebase.admin.lar.AdminPortletDataHandlerImpl&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Note that &lt;em&gt;com.liferay.portal.kernel.lar.BasePortletDataHandler&lt;/em&gt; implements &lt;em&gt;com.liferay.portal.kernel.lar.PortletDataHandler&lt;/em&gt;. Thus we can say, &lt;em&gt;com.liferay.knowledgebase.admin.lar.AdminPortletDataHandlerImpl&lt;/em&gt; implements &lt;em&gt;com.liferay.portal.kernel.lar.PortletDataHandler.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;com.liferay.portal.kernel.lar.PortletDataHandler&lt;/em&gt; has following interface.&lt;/p&gt;&lt;p&gt;&lt;em&gt;public interface PortletDataHandler {&lt;br /&gt;public PortletPreferences deleteData(PortletDataContext portletDataContext, String portletId, PortletPreferences portletPreferences) throws PortletDataException;&lt;br /&gt;&lt;strong&gt;public String exportData(PortletDataContext portletDataContext, String portletId,PortletPreferences portletPreferences) throws PortletDataException;&lt;/strong&gt;&lt;br /&gt;public PortletDataHandlerControl[] getExportControls() throws PortletDataException;&lt;br /&gt;public PortletDataHandlerControl[] getImportControls() throws PortletDataException;&lt;br /&gt;&lt;strong&gt;public PortletPreferences importData(PortletDataContext portletDataContext, String portletId, PortletPreferences portletPreferences, String data) throws PortletDataException;&lt;/strong&gt;&lt;br /&gt;public boolean isAlwaysExportable();&lt;br /&gt;public boolean isPublishToLiveByDefault();&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;com.liferay.portal.kernel.lar.BasePortletDataHandler&lt;/em&gt; has following interfaces:&lt;br /&gt;&lt;em&gt;public PortletPreferences deleteData(&lt;br /&gt;&amp;nbsp;PortletDataContext portletDataContext, String portletId,PortletPreferences portletPreferences)&lt;br /&gt;public String exportData(&lt;br /&gt;&amp;nbsp;PortletDataContext portletDataContext, String portletId,PortletPreferences portletPreferences)&lt;br /&gt;public PortletDataHandlerControl[] getExportControls()&lt;br /&gt;public PortletDataHandlerControl[] getImportControls()&lt;br /&gt;public boolean isAlwaysExportable()&lt;br /&gt;public boolean isPublishToLiveByDefault()&lt;br /&gt;public PortletPreferences importData(&lt;br /&gt;&amp;nbsp;PortletDataContext portletDataContext, String portletId,&lt;br /&gt;&amp;nbsp;PortletPreferences portletPreferences, String data)&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;protected PortletPreferences doDeleteData(&lt;br /&gt;&amp;nbsp;PortletDataContext portletDataContext, String portletId,PortletPreferences portletPreferences)&lt;br /&gt;protected String doExportData(&lt;br /&gt;&amp;nbsp;PortletDataContext portletDataContext, String portletId, PortletPreferences portletPreferences)&lt;br /&gt;protected PortletPreferences doImportData(&lt;br /&gt;&amp;nbsp;PortletDataContext portletDataContext, String portletId,PortletPreferences portletPreferences, String data)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Implement methods &lt;em&gt;doDeleteData()&lt;/em&gt;, &lt;em&gt;doExportData()&lt;/em&gt; and &lt;em&gt;doImportData()&lt;/em&gt; in &lt;em&gt;com.liferay.knowledgebase.admin.lar.AdminPortletDataHandlerImpl&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves /&gt;
  &lt;w:TrackFormatting /&gt;
  &lt;w:PunctuationKerning /&gt;
  &lt;w:ValidateAgainstSchemas /&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF /&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables /&gt;
   &lt;w:SnapToGridInCell /&gt;
   &lt;w:WrapTextWithPunct /&gt;
   &lt;w:UseAsianBreakRules /&gt;
   &lt;w:DontGrowAutofit /&gt;
   &lt;w:SplitPgBreakAndParaMark /&gt;
   &lt;w:DontVertAlignCellWithSp /&gt;
   &lt;w:DontBreakConstrainedForcedTables /&gt;
   &lt;w:DontVertAlignInTxbx /&gt;
   &lt;w:Word11KerningPairs /&gt;
   &lt;w:CachedColBalance /&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math" /&gt;
   &lt;m:brkBin m:val="before" /&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
   &lt;m:smallFrac m:val="off" /&gt;
   &lt;m:dispDef /&gt;
   &lt;m:lMargin m:val="0" /&gt;
   &lt;m:rMargin m:val="0" /&gt;
   &lt;m:defJc m:val="centerGroup" /&gt;
   &lt;m:wrapIndent m:val="1440" /&gt;
   &lt;m:intLim m:val="subSup" /&gt;
   &lt;m:naryLim m:val="undOvr" /&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;/p&gt;&lt;p&gt;In method &lt;em&gt;doDeleteData()&lt;/em&gt;, remove articles, comments and templates&amp;nbsp; by group.&lt;/p&gt;  &lt;p&gt;in methods &lt;em&gt;doExportData()&lt;/em&gt; and &lt;em&gt;doImportData()&lt;/em&gt;, export / import following items:&lt;/p&gt;&lt;p&gt;&lt;em&gt;custom assets: &lt;/em&gt;Articles, Comments, Templates&lt;/p&gt;  &lt;p&gt;&lt;em&gt;custom assets&amp;rsquo; associations: &lt;/em&gt;attachments (as documents), images (if any), polls (if any), asset rating, asset view counts, asset comments and votes on comments, subscriptions, address (if any), asset tags, asset categories, custom fields, permissions, etc.&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;That's it. This is useful, isn&amp;rsquo;t it?&lt;/p&gt;    &lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In brief, import/export and remote publishing features are available for custom assets in plugins. You can use import/export feature to archive your custom assets (&lt;strong&gt;&lt;em&gt;Use case A&lt;/em&gt;&lt;/strong&gt;), and remote publishing feature to push custom assets from staging server to remote live servers with one simple click (&lt;em&gt;&lt;strong&gt;Use case B&lt;/strong&gt;&lt;/em&gt;). Especially, you can schedule remote publish processes as well. Let&amp;rsquo;s address scheduling feature later.&lt;/p&gt;&lt;p&gt;By the way, you can have a closer look at the knowledge base source code (revision 69840) with LAR and remote publishing features in&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.liferay.com/community/forums/-/message_boards/message/7014901#_19_message_7016102"&gt;knowledge-base-portlet-6.1.0.1.war&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Last but not least, I'd like to send a ton of thanks to Liferay development team and Liferay community, who made a lot of good stuff.&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2011-01-05T16:49:33Z</dc:date>
  </entry>
  <entry>
    <title>Speeding up LDAP import process and Liferay authentication</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/speeding-up-ldap-import-process-and-liferay-authentication" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/speeding-up-ldap-import-process-and-liferay-authentication</id>
    <updated>2010-12-15T14:00:24Z</updated>
    <published>2010-12-14T01:37:50Z</published>
    <summary type="html">&lt;p&gt;Liferay 5.2 EE and 6 improved the capabilities of LDAP integration in many areas (refer to blogs posts &lt;a href="http://www.liferay.com/web/michael.han/blog/-/blogs/ldap-enhancements"&gt;LDAP Enhancements&lt;/a&gt; and &lt;a href="../../../../../web/jonas.yuan/blog/-/blogs/keeping-user-password-secure-with-ldap-integration?_33_redirect=%2Fweb%2Fjonas.yuan%2Fblog"&gt;Keeping user password secure with LDAP integration&lt;/a&gt;):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;synchronize user custom attributes between Liferay and LDAP&lt;/li&gt;&lt;li&gt;support LDAP chains and LDAP pagination&lt;/li&gt;&lt;li&gt;create a role for each LDAP group&lt;/li&gt;&lt;li&gt;override LDAP import and export processes via Spring&lt;/li&gt;&lt;li&gt;secure LDAP&amp;nbsp;users' password&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As you know, base DN is used as a base to search users and groups. When the number of users and groups is small, you would not meet any performance issue when searching users and groups. But if the number of users and groups is huge (like 500K users and 50K groups in LDAP), you would meet any performance issue when searching users and groups, since each user may be part of 50 groups.&lt;/p&gt;&lt;p&gt;Use case A (as shown in following screenshot): 500K users and 50K groups. Each user may be part of 50 groups. When logged in as a user from LDAP, it took 20-30 seconds by default. It should take less than 1 second.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img height="255" width="375" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9b857597-f563-4465-8fc1-d7bcbef07ade&amp;amp;groupId=31578&amp;amp;t=1292290227067" /&gt;&lt;/p&gt;&lt;p&gt;The portal does introduce following property to search groups.&lt;/p&gt;&lt;p&gt;&lt;em&gt;ldap.import.group.search.filter.enabled=true&lt;/em&gt;&lt;/p&gt;&lt;p&gt;As shown in above code, if set above property to true, the group filter will be applied, but only to groups in the specified base DN. If set to false, the filter will not be applied and all groups that are associated with the imported users will be imported regardless of the base DN.&lt;/p&gt;&lt;p&gt;The above workaround proposed would not be an option. Each user may belong to over 50 groups and it would just clutter the system with useless data if you were to import all groups for every user.&lt;/p&gt;&lt;p&gt;This article will address how to speed up LDAP import process and Liferay authentication.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Solution Overview&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In two steps, you should be able to speed up LDAP import process and Liferay authentication.&lt;/p&gt;&lt;p&gt;1) Set up custom group base DN in &lt;em&gt;portal-ext.properties&lt;/em&gt;&lt;/p&gt;&lt;p&gt;# Set this to true to enable custom group based DN settings.&lt;br /&gt;# Set this to false to disable custom group based DN settings. &lt;br /&gt;&lt;em&gt;ldap.import.group.base.dn.enabled=true&lt;/em&gt;&lt;/p&gt;&lt;p&gt;# set up group base DN when the property ldap.import.group.basedn.enabled is set to true&lt;br /&gt;# You can add group base DN against your LDAP here&lt;br /&gt;&lt;em&gt;ldap.import.group.base.dn.default=ou=groups,ou=system&lt;/em&gt;&lt;/p&gt;&lt;p&gt;2) Use custom group base DN in LDAP import process&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;LDAP import process and Liferay authentication just took less than 1 second.&lt;/p&gt;&lt;p&gt;1) Set up base DN as users base DN like&lt;/p&gt;&lt;p&gt;&lt;img height="291" width="465" src="http://cdn.www.liferay.com/image/image_gallery?uuid=be895e20-182c-4420-b404-8f0c8f061465&amp;amp;groupId=31578&amp;amp;t=1292421501859" alt="" /&gt;&lt;/p&gt;&lt;p&gt;2) Test LDAP users&lt;/p&gt;&lt;p&gt;&lt;img height="169" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=70a8b624-5d1d-4eca-937d-0a47bbcfe8cc&amp;amp;groupId=31578&amp;amp;t=1292292478206" alt="" /&gt;&lt;/p&gt;&lt;p&gt;3) Test LDAP groups&lt;/p&gt;&lt;p&gt;&lt;img height="273" width="410" src="http://cdn.www.liferay.com/image/image_gallery?uuid=8f91c580-dc12-48e8-a7fc-665ebc911a5c&amp;amp;groupId=31578&amp;amp;t=1292292365280" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="210" width="655" src="http://cdn.www.liferay.com/image/image_gallery?uuid=392d227c-f761-42da-8312-3eb78fe500b7&amp;amp;groupId=31578&amp;amp;t=1292292365279" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Is this feature useful? your comments / suggestions?&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As you can see, LDAP import process and Liferay authentication can be improved a lot by using base DN as users base DN for users search, and custom group base DN as groups base DN&amp;nbsp;for groups search. Ideally, we should divide base DN &lt;em&gt;ldap.base.dn&lt;/em&gt; into &lt;em&gt;ldap.users.base.dn&lt;/em&gt; and &lt;em&gt;ldap.groups.base.dn&lt;/em&gt; for users search and group searchs, respectively. Refer to &lt;a href="http://issues.liferay.com/browse/LPS-14322"&gt;LPS-14322&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;Last but not least, I'd like to send  special thanks to Eduardo Carneiro and Jenny Chen who did a great job to narrow down the issue and to identify solutions.&lt;/span&gt;&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2010-12-14T01:37:50Z</dc:date>
  </entry>
  <entry>
    <title>Setting up users' screen name and friendly URLs in your own languages</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/setting-up-users-screen-name-and-friendly-urls-in-your-own-languages" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/setting-up-users-screen-name-and-friendly-urls-in-your-own-languages</id>
    <updated>2010-12-22T01:28:12Z</updated>
    <published>2010-12-08T01:57:52Z</published>
    <summary type="html">&lt;p&gt;In Liferay portal, you can use your own language. Multilingual organizations get out-of-the-box support for up to 36 languages. Users can toggle among different language settings with just one click and produce/publish multilingual documents and web content. You can also easily add other languages in your public, private pages, or other organizations.&lt;/p&gt;&lt;p&gt;&lt;em&gt;locales=ar_SA,eu_ES,bg_BG,ca_AD,ca_ES,zh_CN,zh_TW,cs_CZ,nl_NL,en_US,en_GB,et_EE,fi_FI,fr_FR,gl_ES,de_DE,el_GR,iw_IL,hi_IN,hu_HU,in_ID,it_IT,ja_JP,ko_KR,nb_NO,fa_IR,pl_PL,pt_BR,pt_PT,ru_RU,sk_SK,es_ES,sv_SE,tr_TR,uk_UA,vi_VN&lt;/em&gt;&lt;/p&gt;&lt;p&gt;As shown in above locale settings, multi-languages get supported as well in Web Content. That is, web content can be entered in as many languages as desired. As you can see, only content got localized. In addition, the name (article title) and the summary, that is, abstract description of web content, should be localizable, too. &lt;span style="font-size: small;"&gt;(Abstracted from the book: &lt;a href="http://www.amazon.com/Liferay-Portal-6-Enterprise-Intranets/dp/1849510385"&gt;Liferay Portal 6 Enterprise Intranets&lt;/a&gt;).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Fortunately, knowledge base articles have fields: title, content, summary (description), etc. Multi-languages should get supported as well in knowledge base articles. That is, knowledge base articles (title, content and summary) can be entered in as many languages as desired. For more details, you can refer to the blogs post: &lt;a href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/multiple-language-support-for-knowledge-base-articles"&gt;Multiple-language support for Knowledge Base articles&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Currently (at revision 68460), users&amp;rsquo; screen name and friendly URL must be characters between a-z and A-Z or digital number 0-9 plus special characters e.g.&amp;rdquo;-&amp;ldquo;,&amp;rdquo;.&amp;rdquo;,&amp;rdquo;_&amp;rdquo;.&amp;nbsp;&amp;nbsp; That is, users&amp;rsquo; screen name and friendly URL cannot be specified by multiple languages like Chinese, Japanese.&amp;nbsp;&lt;/p&gt;&lt;p&gt;For example, Asia-based users would like to have native user names and friendly URL like Chinese, Japanese, etc.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case A&lt;/strong&gt;: set up native user screen name like &amp;ldquo;underwaterworld&amp;rdquo; as &amp;ldquo;海底世界&amp;rdquo; in Chinese, &amp;ldquo;アンダーウォーターワールド&amp;rdquo; in Japanese. Of course, it could be any locale as mentioned above.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case B&lt;/strong&gt;: set up native friendly URLs like &amp;ldquo;liferay&amp;rdquo; as &amp;ldquo;生命之光&amp;rdquo; in Chinese, &amp;ldquo;生命の光&amp;rdquo; in Japanese. Sure, it could be any locale as mentioned above.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case C&lt;/strong&gt;: set up native user email address like  &amp;ldquo;underwaterworld@abc.com&amp;rdquo; as &amp;ldquo;海底世界@abc.com&amp;rdquo; in Chinese, &amp;ldquo;アンダーウォーターワールド@abc.com&amp;rdquo; in Japanese. Of  course, it could be any locale as mentioned above.&lt;/p&gt;&lt;p&gt;This article will address how to add new feature (use case&lt;strong&gt; A&lt;/strong&gt;, &lt;strong&gt;B&lt;/strong&gt; and &lt;strong&gt;C&lt;/strong&gt;) - support users&amp;rsquo; screen name, email address and friendly URLs with 36 languages in liferay 5.2 and 6.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Solution Overview&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In general, you should be able to create native user names and friendly URL with your own languages. As shown in following screen-shot, you should be able to see samples.&lt;/p&gt;&lt;p&gt;Setting up a group in Japanese, frienly URL as &amp;ldquo;生命の光&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;img height="335" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=ab7a5512-32d0-4ffd-a8ca-1bdfc22f05f7&amp;amp;groupId=31578&amp;amp;t=1291817862601" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Setting up a group in Chinese, friendly URL as &amp;ldquo;生命之光&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;img height="305" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=049cc4eb-64d3-4520-96ee-63e486b52f7d&amp;amp;groupId=31578&amp;amp;t=1291817862602" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Creating a new user in Japanese, screen name as  &amp;ldquo;アンダーウォーターワールド&amp;rdquo;, and password as &amp;ldquo;アンダーウォーターワールド&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;img height="302" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=4319f6bc-d38f-43d1-a532-313514cacad1&amp;amp;groupId=31578&amp;amp;t=1291817862602" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Creating a new user in Chinese, screen name as &amp;ldquo;海底世界&amp;rdquo; and password as &amp;ldquo;海底世界&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;img height="263" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f78bf5ff-b61a-4ca9-8d3f-764fa518b723&amp;amp;groupId=31578&amp;amp;t=1291817862602" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Creating a new user in Japanese, native email address as  &amp;ldquo;アンダーウォーターワールド@abc.com&amp;rdquo;, and password as &amp;ldquo;アンダーウォーターワールド&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;img height="303" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=4535fcfd-40bd-44f5-b8d5-e4f8e8631ad3&amp;amp;groupId=31578&amp;amp;t=1292612228037" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Creating a new user in Chinese, screen name as &amp;ldquo;海底世界@abc.com&amp;rdquo; and password as &amp;ldquo;海底世界&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;img height="334" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=17fd9cc2-4811-4731-b0f4-e2a7cf377e92&amp;amp;groupId=31578&amp;amp;t=1292612228022" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;R&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;esults&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case A&lt;/strong&gt;: set up user native screen name like &amp;ldquo;Underwater World&amp;rdquo; as &amp;ldquo;海底世界&amp;rdquo; in Chinese, &amp;ldquo;アンダーウォーターワールド&amp;rdquo; in Japanese&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Set: How do users authenticate?&amp;nbsp; - by screen name&lt;/p&gt;&lt;p&gt;sign in (as screen name / password: &amp;ldquo;アンダーウォーターワールド&amp;rdquo;/&amp;ldquo;アンダーウォーターワールド&amp;rdquo;) in Japanese&lt;/p&gt;&lt;p&gt;&lt;img height="137" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f0276d45-4f46-4c54-a717-5a33996ef4a2&amp;amp;groupId=31578&amp;amp;t=1291817862602" alt="" /&gt;&lt;/p&gt;&lt;p&gt;sign in (as screen name / password: &amp;ldquo;海底世界&amp;rdquo;/&amp;ldquo;海底世界&amp;rdquo;) in Chinese&lt;/p&gt;&lt;p&gt;&lt;img height="135" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=bfb413f2-ba45-464c-b061-50edbe457fe0&amp;amp;groupId=31578&amp;amp;t=1291817862602" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case B&lt;/strong&gt;: set up friendly URLs like &amp;ldquo;liferay&amp;rdquo; as &amp;ldquo;生命之光&amp;rdquo; in Chinese, &amp;ldquo;生命の光&amp;rdquo; in Japanese&lt;/p&gt;&lt;p&gt;Check friendly URL of the group &amp;ldquo;生命の光&amp;rdquo; in Japanese, after signed in.&lt;/p&gt;&lt;p&gt;&lt;img height="218" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=e156f2d6-2730-4782-a8c7-5787bea20dd4&amp;amp;groupId=31578&amp;amp;t=1291817862602" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Check friendly URL of the group &amp;ldquo;生命之光&amp;rdquo;  in Chinese, after signed in.&lt;/p&gt;&lt;p&gt;&lt;img height="219" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9258bca7-d0ad-40e9-8b1e-18e057041a80&amp;amp;groupId=31578&amp;amp;t=1291817862601" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case C&lt;/strong&gt;: set up user native email address&amp;nbsp; like &amp;ldquo;Underwater World@abc.com&amp;rdquo; as &amp;ldquo;海底世界@abc.com&amp;rdquo; in Chinese, &amp;ldquo;アンダーウォーターワールド@abc.com&amp;rdquo; in Japanese&lt;/p&gt;&lt;p&gt;Set: How do users authenticate?&amp;nbsp; - by email address&lt;/p&gt;&lt;p&gt;sign in (as email / password: &amp;ldquo;アンダーウォーターワールド@abc.com&amp;rdquo;/&amp;ldquo;アンダーウォーターワールド&amp;rdquo;) in Japanese&lt;/p&gt;&lt;p&gt;&lt;img height="325" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=eb08a02c-7cea-45f1-8559-9ddb7381deef&amp;amp;groupId=31578&amp;amp;t=1292612228048" /&gt;&lt;/p&gt;&lt;p&gt;After logged in&lt;/p&gt;&lt;p&gt;&lt;img height="288" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=bf064921-8e82-4b13-a7f1-5b5aeaef64a8&amp;amp;groupId=31578&amp;amp;t=1292612228012" /&gt;&lt;/p&gt;&lt;p&gt;sign in (as screen name / password: &amp;ldquo;海底世界@abc.com&amp;rdquo;/&amp;ldquo;海底世界&amp;rdquo;) in Chinese&lt;/p&gt;&lt;p&gt;&lt;img height="277" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=1524e42a-f4e2-4505-b755-51f92579e519&amp;amp;groupId=31578&amp;amp;t=1292612228028" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Summary&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, this feature supports three use cases:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use case A&lt;/strong&gt;: set up native user screen name like  &amp;ldquo;underwaterworld&amp;rdquo; as &amp;ldquo;海底世界&amp;rdquo; in Chinese, &amp;ldquo;アンダーウォーターワールド&amp;rdquo; in Japanese.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case B&lt;/strong&gt;:  set up native friendly URLs like &amp;ldquo;liferay&amp;rdquo; as &amp;ldquo;生命之光&amp;rdquo; in Chinese, &amp;ldquo;生命の光&amp;rdquo;  in Japanese.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use case C&lt;/strong&gt;:  set up native user email address like  &amp;ldquo;underwaterworld@abc.com&amp;rdquo; as  &amp;ldquo;海底世界@abc.com&amp;rdquo; in Chinese, &amp;ldquo;アンダーウォーターワールド@abc.com&amp;rdquo; in Japanese.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That is, with this feature you would be able to set up users' native screen name, native email address and friendly URLs in your own languages (up to 36 languages). Refer to &lt;a href="http://issues.liferay.com/browse/LPS-14436"&gt;LPS-14436&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Is this feature useful? Your comments / suggestions?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2010-12-08T01:57:52Z</dc:date>
  </entry>
  <entry>
    <title>Bringing Google Maps JavaScript API V3 into Liferay Web and WAP</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/bringing-google-maps-javascript-api-v3-into-liferay-web-and-wap" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/bringing-google-maps-javascript-api-v3-into-liferay-web-and-wap</id>
    <updated>2010-12-05T16:15:25Z</updated>
    <published>2010-11-25T21:29:08Z</published>
    <summary type="html">&lt;p&gt;Liferay 6 provided integration with Google Maps JavaScript API V2. More details, AUI tags are used to integrate Google Maps JavaScript API V2. The Google Maps API lets us embed Google Maps in the web pages with JavaScript. The API provides a number of utilities for manipulating &lt;a href="http://maps.google.com"&gt;maps&lt;/a&gt; and adding content to the map through a variety of services, allowing us to create robust maps applications on website. The following is sample code.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt;aui:script&amp;gt;&lt;br /&gt;&amp;nbsp; var &amp;lt;portlet:namespace /&amp;gt;map;&lt;br /&gt;&amp;nbsp; var &amp;lt;portlet:namespace /&amp;gt;geocoder;&lt;br /&gt;&amp;nbsp; function &amp;lt;portlet:namespace /&amp;gt;load() {...} &lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;lt;/aui:script&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;You can also refer to &lt;a href="svn://svn.liferay.com/repos/public/plugins/trunk/portlets/google-maps-portlet/docroot/view.jsp"&gt;view.jsp&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;V3 of Google Maps JavaScript API is especially designed to be faster and more applicable to mobile devices, as well as traditional desktop browser applications. New features of V3 include,&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Draggable directions within the V3 Maps API allowing users to modify directions and add waypoints by dragging the path on the map.&lt;/li&gt;&lt;li&gt;Create your own Custom Panoramas and display them using the V3 Maps API Street View service.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Most importantly, V2 of&amp;nbsp; Google Maps JavaScript API has been officially deprecated, refer to &lt;a href="http://code.google.com/apis/maps/documentation/javascript/basics.html"&gt;basics.html&lt;/a&gt;. Thus it is time for Liferay community to upgrade to Google Maps JavaScript API V3 &lt;a href="http://issues.liferay.com/browse/LPS-13968"&gt;LPS-13968&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This article will address how to bring Google Maps JavaScript API V3 into Liferay 6 Web and WAP - Mobile devices.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Integration Overview&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Google Maps JavaScript API is more applicable to mobile devices, as well as traditional desktop browser applications. Normally, mobile devices and desktop browser applications should support HTML 5.&amp;nbsp; Here list a few browsers as examples.&lt;/p&gt;&lt;p&gt;Safari 5&lt;/p&gt;&lt;p&gt;&lt;img height="361" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=164fc4d3-1144-467c-91d4-e6b02972c313&amp;amp;groupId=31578&amp;amp;t=1290720012400" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Chrome 7 and FireFox 3.6&lt;/p&gt;&lt;p&gt;&lt;img height="313" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=a8c42e40-8d38-4ce1-a836-40610d601e15&amp;amp;groupId=31578&amp;amp;t=1290720012408" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;And most importantly, Google Maps JavaScript API V3 is especially designed to be faster and more applicable to mobile devices, like iPhone (iOS v2.2 - v4.0), Palm Pre (webOS v1.4.1), Android (v1.5 - v2.2), BlackBerry OS (v5.0, v6.0), especially iPad, etc.&lt;/p&gt;&lt;p&gt;iPhone 4&lt;/p&gt;&lt;p&gt;&lt;img height="351" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f9377b88-a779-44cd-97f9-f51c2567cc9c&amp;amp;groupId=31578&amp;amp;t=1290961519756" /&gt;&lt;/p&gt;&lt;p&gt;Palm Pre&lt;/p&gt;&lt;p&gt;&lt;img height="382" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=016293d0-8273-4288-b292-838fef64ae84&amp;amp;groupId=31578&amp;amp;t=1290961519764" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Implementation &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In general, you can bring Google Maps JavaScript API V3 into Liferay WEB and WAP in three steps.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Declare a true DOCTYPE within your web application. That is, declare the applications as HTML5 using the simple HTML5 DOCTYPE as shown below&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;lt;!DOCTYPE html&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;For the map to display on a web page, you must reserve a spot for it by creating a named div element and obtaining a reference to this element in the browser's document object model (DOM).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;lt;div id=&amp;quot;map_canvas&amp;quot; style=&amp;quot;width: 100%; height: 100%&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add JavaScript calls as follows&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://maps.google.com/maps/api/js?sensor=true&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp; function initialize() {&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var &amp;lt;portlet:namespace /&amp;gt;geocoder = new google.maps.Geocoder();&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myLatlng = new google.maps.LatLng(-34.397, 150.644);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myOptions = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zoom: 8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; center: myLatlng,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; var &lt;/em&gt;&lt;em&gt;&amp;lt;portlet:namespace /&amp;gt;&lt;/em&gt;&lt;em&gt;map = new google.maps.Map(document.getElementById(&amp;quot;map_canvas&amp;quot;), myOptions);&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;As you can see, JavaScript specifies the JavaScript class that represents a map is the Map class.&lt;/p&gt;&lt;p&gt;&lt;em&gt;var &lt;/em&gt;&lt;em&gt;&amp;lt;portlet:namespace /&amp;gt;&lt;/em&gt;&lt;em&gt;map = new google.maps.Map(document.getElementById(&amp;quot;map_canvas&amp;quot;), myOptions);&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Of course, you can add your JavaScript code inside the method &lt;em&gt;initialize()&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Based on above steps, you can build a portlet called &lt;strong&gt;Google Maps V3&lt;/strong&gt; for both WEB and WAP in following steps.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Using &lt;em&gt;HTML5 DOCTYPE&lt;/em&gt; in the theme (either WEB or WAP theme), like Classic theme (WEB) in Liferay 6.&lt;/li&gt;&lt;li&gt;Adding DOM &lt;em&gt;&amp;lt;DIV&amp;gt;&lt;/em&gt; and JavaScript in view pages of the portlet &lt;strong&gt;Google Maps V3&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That's it. Is it so easy?&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;What&amp;rsquo;s next? &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Google Maps JavaScript API V3 provides a lot of features like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Events&lt;/li&gt;&lt;li&gt;Controls&lt;/li&gt;&lt;li&gt;Overlays&lt;/li&gt;&lt;li&gt;Services&lt;/li&gt;&lt;li&gt;Map Types&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It would be nice that the portlet Google Maps V3 could merge above features in one place and, moreover, end users could customize their maps easily.&lt;/p&gt;&lt;p&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves /&gt;
  &lt;w:TrackFormatting /&gt;
  &lt;w:PunctuationKerning /&gt;
  &lt;w:ValidateAgainstSchemas /&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF /&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables /&gt;
   &lt;w:SnapToGridInCell /&gt;
   &lt;w:WrapTextWithPunct /&gt;
   &lt;w:UseAsianBreakRules /&gt;
   &lt;w:DontGrowAutofit /&gt;
   &lt;w:SplitPgBreakAndParaMark /&gt;
   &lt;w:DontVertAlignCellWithSp /&gt;
   &lt;w:DontBreakConstrainedForcedTables /&gt;
   &lt;w:DontVertAlignInTxbx /&gt;
   &lt;w:Word11KerningPairs /&gt;
   &lt;w:CachedColBalance /&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math" /&gt;
   &lt;m:brkBin m:val="before" /&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
   &lt;m:smallFrac m:val="off" /&gt;
   &lt;m:dispDef /&gt;
   &lt;m:lMargin m:val="0" /&gt;
   &lt;m:rMargin m:val="0" /&gt;
   &lt;m:defJc m:val="centerGroup" /&gt;
   &lt;m:wrapIndent m:val="1440" /&gt;
   &lt;m:intLim m:val="subSup" /&gt;
   &lt;m:naryLim m:val="undOvr" /&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Your comments / suggestions?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2010-11-25T21:29:08Z</dc:date>
  </entry>
  <entry>
    <title>Keeping user password secure with LDAP integration</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/keeping-user-password-secure-with-ldap-integration" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/keeping-user-password-secure-with-ldap-integration</id>
    <updated>2010-12-14T17:08:10Z</updated>
    <published>2010-11-23T18:30:25Z</published>
    <summary type="html">&lt;p&gt;Liferay 5.2 EE and 6 improved the capabilities of LDAP integration in many areas (refer to blogs post &lt;a href="http://www.liferay.com/web/michael.han/blog/-/blogs/ldap-enhancements"&gt;LDAP Enhancements by Michael C. Han&lt;/a&gt;):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;synchronize user custom attributes between Liferay and LDAP&lt;/li&gt;&lt;li&gt;support LDAP chains and LDAP pagination&lt;/li&gt;&lt;li&gt;create a role for each LDAP group&lt;/li&gt;&lt;li&gt;override LDAP import and export processes via Spring&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When importing users from LDAP, user&amp;rsquo;s info and password got imported. Of course, all passwords stored in Liferay are secure. Especially, the LDAP password mapping field is optional. In some use cases, the fact Liferay stores users&amp;rsquo; password is against some companies&amp;rsquo; security policy rules.&lt;/p&gt;&lt;p&gt;Liferay should not import user's password from LDAP when required (&lt;a href="http://issues.liferay.com/browse/LPS-13933"&gt;LPS-13933&lt;/a&gt;). That is, an improvement would be nice to allow the portal admin to choose whether to save the user's LDAP password when they login or not. How to implement this? This article will address how to make this feature happening in Liferay 5.2 and 6.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Solution&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt; overview&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The following diagram shows solution overview.&amp;nbsp; LDAP contains a lot of users&amp;rsquo; info (plus user&amp;rsquo;s password) and groups&amp;rsquo; info. Liferay portal provides users (and contacts), user groups and roles in place with following mappings&lt;/p&gt;&lt;p&gt;&lt;em&gt;LDAP user info &amp;lt;==&amp;gt; Liferay user info (and contact, password is not included)&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;LDAP groups (and users membership) &amp;lt;==&amp;gt; Liferay user groups and roles (and users membership)&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;In addition, the portal will use user&amp;rsquo;s password to authenticate only. When users login, the portal will import (add or update) user&amp;rsquo;s info, and then, the portal will add default passwords (such as user screen name, user id, email address, or plain text) as temporal and secure passwords.&lt;/p&gt;&lt;p&gt;When LDAP was enabled, the portal will use LDAP user and its password to authenticate. Once LDAP was disabled (or disconnected), the portal will activate &amp;ldquo;forgot password&amp;rdquo; process to reset user&amp;rsquo;s password and send new auto-generated password by email; or the portal will activate &amp;ldquo;required reset password&amp;rdquo; password policy to update user&amp;rsquo;s password after first-time login.&lt;/p&gt;&lt;p&gt;&lt;img height="270" width="660" src="http://cdn.www.liferay.com/image/image_gallery?uuid=a8719d6a-f837-4cd8-90dd-0f14320e49da&amp;amp;groupId=31578&amp;amp;t=1290544160113" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Implementation&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This feature could be implemented in two steps.&lt;/p&gt;&lt;p&gt;1) Adding following  properties in portal.properties - especially in LDAP section.&lt;/p&gt;&lt;p&gt;&lt;em&gt;# Set this to true if the portal does import LDAP user's password. &lt;br /&gt; 	# Set this to false if the portal does not import LDAP user's password;  &lt;/em&gt;&lt;br /&gt; 	&lt;em&gt;ldap.import.user.password.enabled=false&lt;/em&gt;&lt;br /&gt; 	 &lt;br /&gt; 	&lt;em&gt;# Set this to false if LDAP user's password is not auto-generated; &lt;br /&gt; 	# This property is in use only if the property ldap.import.user.password.enabled is set to false. &lt;/em&gt;&lt;br /&gt; 	&lt;em&gt;ldap.import.user.password.autogenerated=false&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;# use default password as LDAP user's password: $SCREENNAME$, $USERID$, $EMAILADDRESS$, or plain text. &lt;br /&gt; 	# This property is in use only if the property ldap.import.user.password.enabled is set to false  &lt;br /&gt; 	# and the property ldap.import.user.password.auto-generated is set to false, too.  &lt;/em&gt;&lt;br /&gt; 	&lt;em&gt;ldap.import.user.password.default=test &lt;/em&gt;&lt;/p&gt;&lt;p&gt;2) updating methods addUser and updateUser with above settings in Portal LDAP importer.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves /&gt;
  &lt;w:TrackFormatting /&gt;
  &lt;w:PunctuationKerning /&gt;
  &lt;w:ValidateAgainstSchemas /&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF /&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables /&gt;
   &lt;w:SnapToGridInCell /&gt;
   &lt;w:WrapTextWithPunct /&gt;
   &lt;w:UseAsianBreakRules /&gt;
   &lt;w:DontGrowAutofit /&gt;
   &lt;w:SplitPgBreakAndParaMark /&gt;
   &lt;w:DontVertAlignCellWithSp /&gt;
   &lt;w:DontBreakConstrainedForcedTables /&gt;
   &lt;w:DontVertAlignInTxbx /&gt;
   &lt;w:Word11KerningPairs /&gt;
   &lt;w:CachedColBalance /&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math" /&gt;
   &lt;m:brkBin m:val="before" /&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
   &lt;m:smallFrac m:val="off" /&gt;
   &lt;m:dispDef /&gt;
   &lt;m:lMargin m:val="0" /&gt;
   &lt;m:rMargin m:val="0" /&gt;
   &lt;m:defJc m:val="centerGroup" /&gt;
   &lt;m:wrapIndent m:val="1440" /&gt;
   &lt;m:intLim m:val="subSup" /&gt;
   &lt;m:naryLim m:val="undOvr" /&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;This feature was tested in 5.2 EE and 6.0 CE / EE. Three testing use cases were included as follows.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use case A &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Set following property to true, LDAP integration was resumed to default behavior; that is, all users&amp;rsquo; passwords got imported and stored in secure in Liferay database. &lt;em&gt;&lt;strong&gt;This is Liferay default behavior&amp;nbsp; - nice way to revert back easily.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;ldap.import.user.password.enabled=true&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case B&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Set following properties, LDAP integration will not import users' password; instead, random password will be auto-generated for users.&lt;/p&gt;&lt;p&gt;&lt;em&gt;ldap.import.user.password.enabled=false &lt;br /&gt;ldap.import.user.password.autogenerated=true&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case C&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Set following properties, LDAP integration will not import users' password; instead, pre-defined password will be assigned to users.&lt;/p&gt;&lt;p&gt;&lt;em&gt;ldap.import.user.password.enabled=false &lt;br /&gt;ldap.import.user.password.autogenerated=false&lt;br /&gt;ldap.import.user.password.default=test&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This feature will be available at 6.1 and 6.0 EE SP1. This is good news. &lt;/p&gt;&lt;p&gt;Is this feature useful? Your comments or suggestions?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2010-11-23T18:30:25Z</dc:date>
  </entry>
  <entry>
    <title>Organization hierarchy, virtual host and friendly URL</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/organization-hierarchy-virtual-host-and-friendly-url" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/organization-hierarchy-virtual-host-and-friendly-url</id>
    <updated>2010-12-20T22:56:54Z</updated>
    <published>2010-11-16T01:44:53Z</published>
    <summary type="html">&lt;p&gt;Liferay portal provides a lot of cool features, for example, Organization hierarchy, virtual host and SEO (Search engine optimization) friendly URL. Web sites can be built based on organizations and organization hierarchy. Each organization can have public pages and private pages.&amp;nbsp; Each organization can have friendly URL, like &lt;em&gt;/my-org&lt;/em&gt;, where only one slash is allowed, while each page can have friendly URL, like &lt;em&gt;/home&lt;/em&gt;, &lt;em&gt;/flickr/home&lt;/em&gt;, where multiple slashes got supported. In addition, organization public pages can have public virtual host; organization private pages can have private virtual host. (Abstracted from the book: &lt;a target="_blank" href="http://www.amazon.com/Liferay-Portal-6-Enterprise-Intranets/dp/1849510385"&gt;Liferay Portal 6 Enterprise Intranets&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Indeed, these are powerful features to build and manage website. In some use cases, these would not be sufficient. For example, here is a custom model: each brand can have many destinations, while each destination can have many hotels. Each Brand, destination or hotel will have its own public pages and private pages.&lt;/p&gt;&lt;p&gt;&lt;img height="378" width="511" src="http://cdn.www.liferay.com/image/image_gallery?uuid=5cf186df-1844-4d75-bf29-d3a9912a0eed&amp;amp;groupId=31578&amp;amp;t=1290022834764" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;As shown in the preceding diagram, each brand will have public virtual host &amp;ndash; domain name and SEO friendly URL:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case A)&lt;/strong&gt;&lt;em&gt; http://www.${brand.name}.com[/${locale}]&lt;/em&gt;&lt;/p&gt;&lt;p&gt;where ${brand.name} should be brand (presented as a root organization) friendly URL. While destination and hotel do not need virtual host, but they need SEO friendly URL like&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case B)&lt;/strong&gt; &lt;em&gt;http://www.${brand.name}.com[/${locale}]&lt;/em&gt;&lt;em&gt;/${destination.name}&lt;/em&gt; for destination&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case C)&lt;/strong&gt;&lt;em&gt; &lt;/em&gt;&lt;em&gt;http://www.${brand.name}.com[/${locale}]&lt;/em&gt;&lt;em&gt;/${destination.name}/${hotel.name}&lt;/em&gt; for hotel&lt;/p&gt;&lt;p&gt;Where &lt;em&gt;${destination.name}&lt;/em&gt; should be destination (presented as a 1&lt;sup&gt;st&lt;/sup&gt; level organization) SEO friendly URL; &lt;em&gt;${hotel.name}&lt;/em&gt; should be hotel (presented as a 2&lt;sup&gt;nd&lt;/sup&gt; level organization) SEO friendly URL.&lt;/p&gt;&lt;p&gt;How to implement these use cases A), B) and C)? This article will show what organization hierarchy, virtual host and SEO friendly URL are and how to extend these features.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Organization hierarchy&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Regular organization can be a root, having no parent organization, like &lt;em&gt;Fiesta Americana&lt;/em&gt;; or regular organization can have a parent organization, like &lt;em&gt;Cancun&lt;/em&gt;, &lt;em&gt;Mexico City&lt;/em&gt;, and many child organizations or locations, like &lt;em&gt;Fiesta-Americana Villas Cancun&lt;/em&gt;, &lt;em&gt;Fiesta Americana Reforma&lt;/em&gt;, and &lt;em&gt;Fiesta Americana Santa Fe&lt;/em&gt;. Location must have a regular organization as parent, and have no child organizations. Therefore, organizations and locations form a hierarchical structure: regular organizations form root and trunk; while locations form leaves, as shown in following screenshot.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="355" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=34c3b41d-377b-4d8c-8d26-10100dd85db7&amp;amp;groupId=31578&amp;amp;t=1290035178012" /&gt;&amp;nbsp;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Virtual host&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Suppose that you have virtual domain (or real domain): &lt;em&gt;demo.fiestamericana.com&lt;/em&gt;. &lt;br /&gt;You can set public virtual host for the organization Fiesta Americana to demo.fiestamericana.com as follows.&lt;/p&gt;&lt;p&gt;&lt;img height="305" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=ba358f4a-d54c-4eed-8a97-8b86bf21cfdb&amp;amp;groupId=31578&amp;amp;t=1290035459590" /&gt;&lt;/p&gt;&lt;p&gt;Then you can view any pages of the organization &lt;em&gt;Fiesta Americana&lt;/em&gt;.&lt;br /&gt;&lt;em&gt;http://demo.fiestamericana.com/${layout.friendly.url}&lt;/em&gt;&lt;/p&gt;&lt;p&gt;You can also view any pages in different languages.&lt;br /&gt;&lt;em&gt;http://demo.fiestamericana.com[/${locale}]/${layout.friendly.url}&lt;/em&gt;&lt;/p&gt;&lt;p&gt;As you can see, use case A) can be implemented by group public or private virtual host settings.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Friendly URL&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Both Group and Layout can have friend URL.&lt;/p&gt;&lt;p&gt;&lt;a href="http://issues.liferay.com/browse/LPS-5284"&gt;As Brian Chan mentioned earlier, Group friendly URL should have one and only slash&lt;/a&gt;. As shown in the preceding screenshot, the organization &lt;em&gt;Fiesta Americana&lt;/em&gt; has friendly URL &amp;quot;/fiesta-ammericana&amp;quot; - there is one and only slash.&lt;/p&gt;&lt;p&gt;Layout can have  friendly URL with multiple slashes. As shown in following screenshot, layout &amp;quot;Test&amp;quot; has friendly URL &amp;quot;/home/test&amp;quot;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img height="416" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=e85abdb5-4300-4708-b2b1-f63d31c6d203&amp;amp;groupId=31578&amp;amp;t=1290037028597" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Customizing virtual host and friendly URL&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, using liferay default features, use cases B) and C) can not be satisfied with.&lt;/p&gt;&lt;p&gt;Thus Here I suggest a new feature: customizing group friendly URL and virtual host.&lt;/p&gt;&lt;p&gt;How?&lt;/p&gt;&lt;p&gt;1) first provide properties - adding following properties in portal-ext.properties.&lt;/p&gt;&lt;p&gt;&lt;em&gt;##&lt;br /&gt;## custom organization friendly URLs&lt;br /&gt;##&lt;br /&gt;## enabling custom organization friendly URLs, &lt;br /&gt;## set custom.organization.friendly.url.enabled to true; &lt;br /&gt;## otherwise set it to false&lt;br /&gt;&lt;br /&gt;custom.organization.friendly.url.enabled=true&lt;/em&gt;&lt;/p&gt;&lt;p&gt;2) Then customize group friendly URL and virtual host in Virtual Host Filter&lt;/p&gt;&lt;p&gt;3) Definitely keep Liferay portal default features (group friendly URL and virtual host) 100% AS IS; and add customized group friendly URL and virtual host on top of default features.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Results&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;After applying the new feature, both use case B) and use case C) got supported.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case B)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="139" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=2116c315-6a5d-45e6-9f7e-ac6b463d99e8&amp;amp;groupId=31578&amp;amp;t=1290040044409" /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/cancun &lt;/em&gt;for default language, that is, US&amp;nbsp;English;&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/de/cancun&lt;/em&gt; for German.&lt;/p&gt;&lt;p&gt;Of course, Liferay default features are working well AS&amp;nbsp;IS. Suppose that &lt;em&gt;layout.friendly.url.public.servlet.mapping&lt;/em&gt; is set by default as &lt;em&gt;/web&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/web/cancun &lt;/em&gt;for default language, that is, US&amp;nbsp;English;&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/de/web/cancun&lt;/em&gt; for German.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Use case C)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/es/cancun/fiesta-americana-villas-cancun&lt;/em&gt; for Spanish.&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/de/cancun/fiesta-americana-villas-cancun&lt;/em&gt; for German.&lt;/p&gt;&lt;p&gt;&lt;img height="181" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=b28e5184-4850-46ed-b828-063fd27970d6&amp;amp;groupId=31578&amp;amp;t=1290040062795" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;em&gt;http://demo.fiestamericana.com/cancun/fiesta-americana-villas-cancun&lt;/em&gt; for default locale, that is, US English&lt;/p&gt;&lt;p&gt;&lt;img height="187" width="660" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=7de39add-cabd-4079-947a-4f8b64a9f229&amp;amp;groupId=31578&amp;amp;t=1290040088342" /&gt;&lt;/p&gt;&lt;p&gt;Sure, Liferay default features are working well 100% AS&amp;nbsp;IS.&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/es/web/fiesta-americana-villas-cancun&lt;/em&gt; for Spanish.&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/de/web/fiesta-americana-villas-cancun&lt;/em&gt; for German.&lt;/p&gt;&lt;p&gt;&lt;em&gt;http://demo.fiestamericana.com/web/fiesta-americana-villas-cancun&lt;/em&gt; for default locale, that is, US English&lt;/p&gt;&lt;p&gt;By the way, to disable this customized feature, you can simply set the property &lt;em&gt;custom.organization.friendly.url.enabled &lt;/em&gt;&lt;em&gt;to&lt;/em&gt;&lt;em&gt; false.&lt;/em&gt;&lt;em&gt; &lt;/em&gt;Then what you have are Liferay default features - 100%, of course.&lt;/p&gt;&lt;p&gt;In addition, you can apply same friendly URLs in Language portlet. Thus when clicking on  the icons in Language portlet, you would be able to get same friendly URLs.&lt;/p&gt;&lt;p&gt;Is this feature useful? Your suggestions?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;What's next?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As you can see, there are a few limitations:&lt;/p&gt;&lt;p&gt;1) Root Organization has been set up virtual host, either public virtual host or private virtual host, or both. What's happening if virtual host was not set properly?&lt;/p&gt;&lt;p&gt;2) Currently destination and hotel friendly URL have been mapped to 1&lt;sup&gt;st&lt;/sup&gt; level organization and 2&lt;sup&gt;nd&lt;/sup&gt; level organization, respectively.&lt;/p&gt;&lt;p&gt;3) All brands have been managed as root organizations in a portal instance. What's happening if one brand has been managed as root organization in one portal instance while another brand has been managed as root organization in another portal instance?&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2010-11-16T01:44:53Z</dc:date>
  </entry>
  <entry>
    <title>Liferay book: Liferay User Interface Development</title>
    <link rel="alternate" href="http://www.liferay.com/web/jonas.yuan/blog/-/blogs/liferay-book:-liferay-user-interface-development" />
    <author>
      <name>Jonas Yuan</name>
    </author>
    <id>http://www.liferay.com/web/jonas.yuan/blog/-/blogs/liferay-book:-liferay-user-interface-development</id>
    <updated>2010-12-10T18:49:25Z</updated>
    <published>2010-10-29T16:54:55Z</published>
    <summary type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;&lt;a href="https://www.packtpub.com/liferay-user-interface-development/book"&gt;Liferay User Interface Development&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: medium;"&gt; &lt;a href="https://www.packtpub.com/liferay-user-interface-development/book"&gt;&lt;img height="294" width="235" align="right" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=48e679af-53ab-4934-8774-0e3627fd9dd1&amp;amp;groupId=31578&amp;amp;t=1291180536477" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Develop a powerful and rich user interface with Liferay Portal 6&lt;/strong&gt;&lt;/span&gt;&lt;/em&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/sites/default/files/2626OS-Chapter-5-Advanced-Theme.pdf"&gt;Sample chapter&lt;/a&gt;, &lt;a href="https://www.packtpub.com/toc/liferay-user-interface-development-table-contents"&gt;Table of contents&lt;/a&gt;, &lt;a href="https://www.packtpub.com/support?nid=6468"&gt;Download code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;An Overview:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Design usable and great-looking user interfaces for Liferay portals&lt;/li&gt;&lt;li&gt;Get familiar with major theme development tools to help you create a striking new look for your Liferay portal&lt;/li&gt;&lt;li&gt;Learn the techniques and tools to help you improve the look and feel of any Liferay portal&lt;/li&gt;&lt;li&gt;A practical guide with lots of sample code included from real Liferay Portal Projects free for use for developing your own projects&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Details &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Liferay employs a specialized theming system, which allows you to change the look and feel of the user interfaces. As a developer, by using the right tools to create and manipulate themes with Liferay Portal, you can get your site to look any way you want it to; but the Liferay theming system can be difficult to get started with. This practical guide provides you with a well organized manual for working with Liferay as a programmer to help you get started.&lt;/p&gt;&lt;p&gt;Liferay User Interface Development is a pioneer in explaining Liferay's powerful theming system by taking you through examples to get you to create your own themes as quickly as possible. It focuses on how portal pages are created and styled and also discusses some simple configuration and customization to change the look and feel of a portal page. Its explicit instructions are accompanied by plenty of source code. With the open source nature of Liferay, you will find a user-friendly environment to design themes with the latest user interface technologies.&lt;/p&gt;&lt;p&gt;Liferay User Interface Development unlocks the potential of using Liferay as a framework to develop a rich user interface.&lt;/p&gt;&lt;p&gt;The book starts off with how you should go about structuring a Liferay Portal web page. It identifies the components of a portal page: theme, layout, and portlets. This hands-on tutorial explains themes, portlets, and Alloy UI, which is the latest output from the Alloy Project of Liferay, in an easy-to-understand way. It covers all aspects of a theme from its inception and rendering through its consumption by an end user, with in-depth discussion.&lt;/p&gt;&lt;p&gt;By the end of this book, you will clearly understand themes, layouts, and the Alloy API. Most importantly you will obtain the skills to write a theme and layout templates, apply them to a portal, and also control the portlet UI through different mechanisms.&lt;/p&gt;&lt;p&gt;This clear, concise, and practical tutorial will ensure that you have developed skills to become a competent Liferay themer. The detailed text is accompanied with source code that allows you to play with the examples, update the code, and add custom features.&lt;/p&gt;&lt;p&gt;A practical guide to customizing the look and feel of Liferay-based portal applications&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;What you will learn from this book :&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Learn Liferay themes inside out in a procedural way with real project example code&lt;/li&gt;&lt;li&gt;Develop variations of a theme through its color schemes by getting familiar with major theme development tools&lt;/li&gt;&lt;li&gt;Customize the Dockbar using Velocity templates, CSS, and the Alloy API&lt;/li&gt;&lt;li&gt;Upgrade a theme from an older Liferay version to Liferay Portal 6 and change the default theme in Liferay&lt;/li&gt;&lt;li&gt;Use AJAX to change page content and generate PDF and Excel reports&lt;/li&gt;&lt;li&gt;Take advantage of Liferay portlet UI tags to save development time&lt;/li&gt;&lt;li&gt;Use Velocity templates to control different parts of a Liferay Portal web page&lt;/li&gt;&lt;li&gt;Get introduced to the latest Liferay user interface &amp;ndash; Alloy UI&lt;/li&gt;&lt;li&gt;Get acquainted with Liferay Alloy form tags and become a fan of the Alloy API&lt;/li&gt;&lt;li&gt;Use UI tag libraries in your pages or portlets including CKEditor, reCAPTCHA, and more&lt;/li&gt;&lt;li&gt;Design themes in WAP and production including jQuery, Workflow, Custom Attributes, Social Activities and Social Equity, WAP theme, Friendly URLs, data migration and portal upgrade, deployment, and performance tuning, etc.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Approach&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This is a basic tutorial that teaches you how to use the tools provided by Liferay to create your own applications. It covers a lot of the material that has API references and documentation of the architecture and illustrates its key concepts with examples.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Who this book is written for&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you have basic knowledge of Java Web applications, know the basic operational functionality of Liferay, and have written a servlet or JSP file, you are ready to get the most out of this book. Whether you are a web portal engineer or an experienced Liferay Portal developer, you can benefit from this book. You are not expected to have prior knowledge of Liferay theming.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Acknowledgements &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: 10px;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-size: 10px;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-size: 10px;"&gt;&lt;span style="font-size: 13px;"&gt;I would like to thank all team members at Liferay, specially Raymond Auge, Brian Chan, Bryan Cheung, Jorge Ferrer, Michael Young, Jerry Niu, Ed Shin, Craig Kaneko, Brian Kim, Bruno Farache,Thiago Moreira, Amos Fong, Scott Lee, David Truong, Alexander Chow, Mika Koivisto, Julio Camarero, Douglas Wong, Ryan Park, Eric Min, John Langkusch, Marco Abamonga, Ryan Park, Eric Min, John Langkusch, Marco Abamonga, Michael Han, Samuel Kong, Nate Cavanaugh, Arcko Duan, Richard Sezov, Joshua Asbury, Shuyang Zhou, and Juan Fernández for providing all the support and valuable information. Much thanks to all the friends in the Liferay community.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Jonas Yuan</dc:creator>
    <dc:date>2010-10-29T16:54:55Z</dc:date>
  </entry>
</feed>


