<?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>Liferay developer notes and experiences</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=5073114" />
  <subtitle>Liferay developer notes and experiences</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=5073114</id>
  <updated>2026-05-07T15:38:16Z</updated>
  <dc:date>2026-05-07T15:38:16Z</dc:date>
  <entry>
    <title>[12. Resource arrangement and deployment options]</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5385254" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5385254</id>
    <updated>2010-07-22T15:49:36Z</updated>
    <published>2010-07-22T15:49:36Z</published>
    <summary type="html">A website in liferay is internally modelled as &lt;strong&gt;group&lt;/strong&gt;. Groups can be 2 types:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;a. Community&lt;/strong&gt;&lt;br /&gt;    Liferay comes by default with Guest community. Ideal for hosting a flat website without having any complex hierarchy. Useful when you just have to deploy a single website.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;b. Organization&lt;/strong&gt;&lt;br /&gt;     Ideal for enterprise having to host multiple sub websites. It has a hierarchy like organization, sub-organization, sub-sub-organization,etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The above two groups can co-exist as well.&lt;br /&gt;All web content articles, structures, tags etc belong to one of these type of group.&lt;br /&gt;&lt;br /&gt;Each website page consisting of several portlets is internally modelled as &lt;strong&gt;layout&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;By default liferay does not enable staging. When staging is enabled for a community or organization a new staging group is created(please refer point 11. in my earlier notes).&lt;br /&gt;With staging comes additional complexity of syncing content over to live group(community or org). This is very painful in liferay as the way publish is implemented and designed is terrible. It works well if you have a small data set. But is really messy (data handler,remote publish, copy from live, etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 24px;"&gt;&lt;strong&gt;Portal instance&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  Portal instance can maintain separation between various groups content.&lt;br /&gt;  This feature enables you to deploy multiple websites in a single box. Internally liferay models it as a company. Both groups (community and organization) should belong to a company. The default out of the box company is called liferay Inc. There is no portal instance however. This feature is only required for complex hosting requirements i think.&lt;br /&gt;  &lt;br /&gt;For managing &lt;br /&gt;  organization - Goto &amp;gt;&amp;gt; control panel &amp;gt; organization&lt;br /&gt;  community - Goto &amp;gt;&amp;gt; control panel &amp;gt; community &lt;br /&gt;  Portal Instances - Goto &amp;gt;&amp;gt; control panel &amp;gt; Portal Instances</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-07-22T15:49:36Z</dc:date>
  </entry>
  <entry>
    <title>RE: [11.Liferay CMS/workflow/publish] Liferay developer notes and experienc</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5385019" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5385019</id>
    <updated>2010-07-22T15:30:04Z</updated>
    <published>2010-07-22T15:30:04Z</published>
    <summary type="html">Thanks Suhail, please vote the topic which interests you by clicking thumbs up/down button.</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-07-22T15:30:04Z</dc:date>
  </entry>
  <entry>
    <title>RE: [11.Liferay CMS/workflow/publish] Liferay developer notes and experienc</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5268887" />
    <author>
      <name>Suhail Ahmed</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5268887</id>
    <updated>2010-07-08T10:51:58Z</updated>
    <published>2010-07-08T10:51:58Z</published>
    <summary type="html">Hi Sandeep,&lt;br /&gt;&lt;br /&gt;I really appreciate for your posts about developer view, and some helpful notes. I ll be waiting for your post on this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks  &lt;img alt="emoticon" src="@theme_images_path@/emoticons/smile.gif" &gt;&lt;img alt="emoticon" src="@theme_images_path@/emoticons/big_grin.gif" &gt;&lt;br /&gt;&lt;br /&gt;Suhail Ahmed</summary>
    <dc:creator>Suhail Ahmed</dc:creator>
    <dc:date>2010-07-08T10:51:58Z</dc:date>
  </entry>
  <entry>
    <title>[11.Liferay CMS/workflow/publish] Liferay developer notes and experiences</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5267324" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5267324</id>
    <updated>2010-07-08T08:27:10Z</updated>
    <published>2010-07-08T08:27:10Z</published>
    <summary type="html">&lt;span style="font-size: 24px;"&gt;&lt;strong&gt;10. Liferay CMS&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The web content resource are organized as below:&lt;br /&gt;&lt;br /&gt;In liferay control panel you have the following for CMS:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Article&lt;/strong&gt;&lt;br /&gt;  Holds the content. The article fields can be configured using a structure. Can belong to a type. Can apply a category. Can be tagged. Stored in DB column journalarticle.content as  xml. Web content list and web content article portlets use these articles.&lt;br /&gt;Article version support is available out of the box.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Structure&lt;/strong&gt;&lt;br /&gt;  Defines all the fields the article will have like text input, text area, image input,etc . Also the velocity template can access these fields using the names configured here.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Template&lt;/strong&gt;&lt;br /&gt;  An article can be displayed using a velocity template. Template can have a structure applied to it. So an article on using a structure can choose one of these templates.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Tags and categories&lt;/strong&gt;&lt;br /&gt;   Provides a way to organize articles and make them searchable/filterable.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Document library&lt;/strong&gt;&lt;br /&gt;   Documents can be uploaded from your file system. They are stored in the database. There is a document library portlet for managing this.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Image gallery&lt;/strong&gt;&lt;br /&gt;   Holds images. These are available for article.&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 24px;"&gt;&lt;strong&gt;Workflow &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  Liferay has a basic workflow support in it.&lt;br /&gt;  Workflow works with staging, hence staging should be turned on first(control panel -&amp;gt; organization -&amp;gt; manage pages -&amp;gt; settings).&lt;br /&gt;  It can be turned on once the staging is selected in the same page.&lt;br /&gt;&lt;br /&gt;With workflow turned on the portal pages has to go through a content editor -&amp;gt; publisher user who has roles to verify the changes and then make the portal page live from staging.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 24px;"&gt;&lt;strong&gt;Publishing &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;This is also a part of workflow. &lt;br /&gt;The publish from staging to live or publish to a portal instance is questionable. &lt;br /&gt;The way liferay does is through a bunch of data handlers for each portlet.&lt;br /&gt;Also content is physically copied over and duplicated for each article with structure,etc.&lt;br /&gt;&lt;br /&gt;The live and staging distinction is done by groups. Live and staging both are separate groups and maintain a copy of web content. Would it have been better if just a status flag was maintained instead of copies? . This would mean any publish should copy content from live group to staging. The data handler in each portlet should ensure this. Most of the pain points are in publish as it is not consistent. It hangs some time and crashes without a clue when one of the web content is broken. Also the publish mechanism is reused for both local and remote publish. In memory the data handler generates a zip archive for contents being exported and unzips it when importing. It would simply mean heap memory will become low on every publilsh. This slows down the publish process heavily. It would be worth if publish bits of liferay is redesigned.&lt;br /&gt;&lt;br /&gt;Given a chance i would recommend people not to use liferay web CMS, but instead integrate alternate CMS like Alfresco into it. Maybe it could be an effort upfront, but its worth it. Alfresco has done a good job in CMS front. Liferay is good with portlets. A breed of this would give you a solid CMS based web 2.0 portal i think.</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-07-08T08:27:10Z</dc:date>
  </entry>
  <entry>
    <title>[9. Database] Liferay developer notes and experiences</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5077079" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5077079</id>
    <updated>2010-06-12T13:33:21Z</updated>
    <published>2010-06-12T13:33:21Z</published>
    <summary type="html">&lt;span style="font-size: 32px;"&gt;9. Database&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;portal-hbm.xml&lt;/strong&gt; has the hibernate mappings for hibernate to use.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Web content related tables are below :&lt;/u&gt;&lt;br /&gt;journalstructure&lt;br /&gt;	Webcontent structures is stored here. The structure id is a string like OUTER_STRUCTURE,etc&lt;br /&gt;	&lt;br /&gt;journalarticle&lt;br /&gt;	Holds the article . has _id and resourcPrimKey .Always use articleId. Remember a data handler should switch articles from staging to live. As staging and live article ids are different.&lt;br /&gt;	&lt;br /&gt;journaltemplate&lt;br /&gt;	Velocity templates are stored here. Column xsl has the velocity content.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Authentication and user info &lt;/u&gt;&lt;br /&gt;User profile tables:&lt;br /&gt;	User_&lt;br /&gt;	Address&lt;br /&gt;	contact_&lt;br /&gt;&lt;br /&gt;Staging information is stored in &lt;br /&gt;	group_&lt;br /&gt;	&lt;br /&gt;portletpreferences&lt;br /&gt;	Store portlet preference. duplicated on moving from staging to live.</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-06-12T13:33:21Z</dc:date>
  </entry>
  <entry>
    <title>[10.Bootstrap] Liferay developer notes and experiences</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5077021" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5077021</id>
    <updated>2010-06-12T12:15:11Z</updated>
    <published>2010-06-12T12:15:11Z</published>
    <summary type="html">&lt;span style="font-size: 32px;"&gt;10. Bootstrap &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some notes on how liferay creates database schema tables and default data the first time when application is deployed(in a blank database) are below:&lt;br /&gt;&lt;br /&gt;1. &lt;strong&gt;ReleaseLocalServiceImpl.createTablesAndPopulate&lt;/strong&gt; generates the database objects. It is used to generate database tables, sequence, etc&lt;br /&gt;   By default the property &lt;strong&gt;schema.run.minimal&lt;/strong&gt; is true hence its doesn&amp;#39;t load sample data (from  &lt;strong&gt;portal-data-sample.vm&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;2. On &lt;strong&gt;MainServlet &lt;/strong&gt;initialization, default user is added to company(if not found).The default admin user is test@liferay.com.  The interaction is below:&lt;br /&gt;    &lt;strong&gt;MainServlet.init() &amp;gt; PortalInstances.initCompany() [web id: liferay.com]  &amp;gt; PortalInstances.initCompany() &amp;gt; CompanyLocalServiceImpl.checkCompany creates a Default admin &amp;gt; UserLocalServiceImpl.addUser&lt;/strong&gt;</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-06-12T12:15:11Z</dc:date>
  </entry>
  <entry>
    <title>[1. web tier]Liferay developer notes and experiences</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5073125" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5073125</id>
    <updated>2010-06-11T10:03:15Z</updated>
    <published>2010-06-11T10:03:15Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Let me start first:&lt;br&gt;&lt;br&gt;&lt;span style="font-size: 32px;"&gt;1. Web tier&lt;/span&gt;&lt;br&gt;  The best thing i like about liferay is its pluggability, you drop portlets(plugins) and configure them and thats it.. And a broken portlet doesnt affect the overall system. Hence making it a solid architecture (close like OSGi i think)&lt;br&gt;&lt;br&gt;  1.1 The default liferay portal uses struts and tiles for web tier and velocity templates for theming. Most of JSR 168 and 286 spec is here. The tag library support of liferay is excellent. For eg: to show an article you just do : &lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;liferay-ui:journal-article articleId="&amp;lt;%= articleId %&amp;gt;" groupId="&amp;lt;%= themeDisplay.getScopeGroupId()%&amp;gt;" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;  1.2 The main entry point for handling portlet request is  &lt;strong&gt;com.liferay.portal.servlet.MainServlet (web.xml)&lt;/strong&gt; . Before that a series of filters are applied(cache, autologin, header, etc)&lt;br&gt;  The &lt;strong&gt;MainServlet &lt;/strong&gt;deligates the request to &lt;strong&gt;PortletRequestProcessor &lt;/strong&gt;which decides which of the &lt;strong&gt;PortletAction &lt;/strong&gt;to call. So basically liferay core web tier is an extended struts implementation.&lt;br&gt;&lt;br&gt;  1.3 Most of us extend PortletAction and implement appropriate methods to solve our functional requirement&lt;br&gt;&lt;br&gt;&lt;strong&gt;p.s:&lt;/strong&gt;&lt;br&gt;Guys please feel free to type in anything you feel is useful. Just remember to mark them with one of the points listed in the begining.&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-06-11T10:03:15Z</dc:date>
  </entry>
  <entry>
    <title>Liferay developer notes and experiences</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5073113" />
    <author>
      <name>sandeep m</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=5073113</id>
    <updated>2010-06-11T10:01:24Z</updated>
    <published>2010-06-11T10:01:24Z</published>
    <summary type="html">The biggest win I think with liferay is a solid community base.&lt;br /&gt;&lt;br /&gt;How about a developer discussion on our experiences with liferay, the patterns we have understood so far.. a bit of knowledge sharing etc.. &lt;br /&gt;Then we can put it up somewhere in the wiki where everyone can see and share.&lt;br /&gt;&lt;br /&gt;This thread can be an ongoing work, please feel free to fill up its stack.&lt;br /&gt;&lt;br /&gt;How about we start with the following categories: &lt;br /&gt;&lt;br /&gt;1. Web tier         &lt;br /&gt;2. Service tier&lt;br /&gt;3. Persistence tier         &lt;br /&gt;4. Integration - Message bus,BPM, workflow     &lt;br /&gt;5. User interface(theme, layout)   &lt;br /&gt;6. Utilities       &lt;br /&gt;7. Ext environment    &lt;br /&gt;8. Plugins         &lt;br /&gt;9. Database, data model, useful tables and relationships.&lt;br /&gt;10. Bootstrap, initialization, startup&lt;br /&gt;11. Liferay CMS/web content/publish/workflow&lt;br /&gt;12. Resource arrangement and deployment options&lt;br /&gt;13. Caching&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please feel free to type in anything you feel is useful. &lt;strong&gt;Just remember to mark them with one of the points listed above&lt;/strong&gt;. If you feel there is a need for a point, do let me know i will add it there.&lt;br /&gt;&lt;br /&gt;If this is too annoying for anyone give me a shout, i will shut it down &lt;img alt="emoticon" src="@theme_images_path@/emoticons/happy.gif" &gt;</summary>
    <dc:creator>sandeep m</dc:creator>
    <dc:date>2010-06-11T10:01:24Z</dc:date>
  </entry>
</feed>
