<?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>Juan Fernández</title>
  <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/rss" />
  <subtitle>Juan Fernández</subtitle>
  <entry>
    <title>Extending an AssetRendererFactory</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/extending-an-assetrendererfactory" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/extending-an-assetrendererfactory</id>
    <updated>2012-01-27T13:47:28Z</updated>
    <published>2012-01-27T13:46:35Z</published>
    <summary type="html">&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
	Many of you know a lot and do an extensive use of the &lt;a href="http://www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/asset-framework"&gt;Asset Framework&lt;/a&gt;, the framework within Liferay Portal that "provides a set of functionalities that are common to several different content types".&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	In many projects we find that developers need to extend the behaviour of the AssetRendererFactories to fit their needs, and, even it is not that hard, it takes a while to think on the best and cleaner way to achieve this.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	In a recent forum post, a user asked how to modify the UserAssetRendererFactory and I decided to write down the steps in a wiki article to share it with the rest of the community.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Here's the link, but for the most impatients, here are the steps to do:&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;a href="http://www.liferay.com/community/wiki/-/wiki/1071674/Extending+an+AssetRendererFactory"&gt;Extending an AssetRendererFactory&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	1.- Create an &lt;a href="http://www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/ext-plugins"&gt;ext plugin&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
	2.- Add the portlet you want to modify/extend to liferay-portlet-ext.xml&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	3.- Make &amp;lt;asset-renderer-factory&amp;gt; point to your custom class&lt;/div&gt;
&lt;div&gt;
	4.- Create a class that extends the original AssetRendererFactory and the add or modify the methods you need&lt;/div&gt;
&lt;div&gt;
	5.- Deploy, restart the server and you are ready to go! :)&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	That's it!&lt;/div&gt;
&lt;div&gt;
	I hope this is useful for you&lt;/div&gt;
&lt;div&gt;
	Regards,&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Juan Fernández&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2012-01-27T13:46:35Z</dc:date>
  </entry>
  <entry>
    <title>Adding the workflow portlets to a page</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/adding-the-workflow-portlets-to-a-page" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/adding-the-workflow-portlets-to-a-page</id>
    <updated>2011-08-30T19:06:04Z</updated>
    <published>2011-08-30T18:58:27Z</published>
    <summary type="html">&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
	Hi all!&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	In a recent project I had to add these portlets ("My Workflow Tasks" and "My Submissions") to a normal user page. By default they are shown in the control panel, but depending on your project needs you may want to use them elsewhere. Here are the steps you need to achieve this easily.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Basically you need three things:&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
	&lt;li&gt;
		Remove them from the control panel&lt;/li&gt;
	&lt;li&gt;
		Add them to the "Add Applications" menu&lt;/li&gt;
	&lt;li&gt;
		Add "ADD_TO_PAGE" permissions&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	To do this you need an ext plugin (which you can create in the liferay plugins sdk via &amp;lt;&amp;lt;create my-ext "my ext"&amp;gt;&amp;gt; command)&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Once you have your ext plugin ready in your plugins sdk, go to your-ext/docroot/WEB-INF/ext-web/docroot/WEB-INF&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	in your-ext/docroot/WEB-INF/ext-web/docroot/WEB-INF/liferay-portlet-ext.xml add this (this is the original content minus the control panel classes configuration)&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.0.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_0_0.dtd"&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;liferay-portlet-app&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;portlet&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;portlet-name&amp;gt;153&amp;lt;/portlet-name&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;icon&amp;gt;/html/icons/my_workflow_tasks.png&amp;lt;/icon&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;struts-path&amp;gt;my_workflow_tasks&amp;lt;/struts-path&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;portlet-url-class&amp;gt;com.liferay.portal.struts.StrutsActionPortletURL&amp;lt;/portlet-url-class&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;use-default-template&amp;gt;false&amp;lt;/use-default-template&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;private-request-attributes&amp;gt;false&amp;lt;/private-request-attributes&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;private-session-attributes&amp;gt;false&amp;lt;/private-session-attributes&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;render-weight&amp;gt;50&amp;lt;/render-weight&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;header-portlet-css&amp;gt;/html/portlet/asset_publisher/css/main.jsp&amp;lt;/header-portlet-css&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;header-portlet-css&amp;gt;/html/portlet/enterprise_admin/css/main.jsp&amp;lt;/header-portlet-css&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;header-portlet-css&amp;gt;/html/portlet/workflow_definitions/css/main.jsp&amp;lt;/header-portlet-css&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;css-class-wrapper&amp;gt;portlet-workflow-tasks&amp;lt;/css-class-wrapper&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;/portlet&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;portlet&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;portlet-name&amp;gt;158&amp;lt;/portlet-name&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;icon&amp;gt;/html/icons/my_workflow_instances.png&amp;lt;/icon&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;struts-path&amp;gt;my_workflow_instances&amp;lt;/struts-path&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;portlet-url-class&amp;gt;com.liferay.portal.struts.StrutsActionPortletURL&amp;lt;/portlet-url-class&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;use-default-template&amp;gt;false&amp;lt;/use-default-template&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;private-request-attributes&amp;gt;false&amp;lt;/private-request-attributes&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;private-session-attributes&amp;gt;false&amp;lt;/private-session-attributes&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;render-weight&amp;gt;50&amp;lt;/render-weight&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;header-portlet-css&amp;gt;/html/portlet/asset_publisher/css/main.jsp&amp;lt;/header-portlet-css&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;header-portlet-css&amp;gt;/html/portlet/enterprise_admin/css/main.jsp&amp;lt;/header-portlet-css&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;header-portlet-css&amp;gt;/html/portlet/workflow_definitions/css/main.jsp&amp;lt;/header-portlet-css&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px; "&gt;
	&lt;em&gt;&amp;lt;css-class-wrapper&amp;gt;portlet-workflow-instances&amp;lt;/css-class-wrapper&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;/portlet&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;/liferay-portlet-app&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	in your-ext/docroot/WEB-INF/ext-web/docroot/WEB-INF/liferay-display.xml remove&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;portlet id="153" /&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;portlet id="158" /&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	from hidden category and add them to another one (the one which you prefer!)&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	In your-ext/docroot/WEB-INF/ext-impl/src/resource-actions/workflow.xml, add this (which is the original workflow.xml after deleting ACCESS_IN_CONTROL_PANEL permission and adding ADD_TO_PAGE):&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;...&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;portlet-name&amp;gt;153&amp;lt;/portlet-name&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;permissions&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;supports&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;action-key&amp;gt;ADD_TO_PAGE&amp;lt;/action-key&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;action-key&amp;gt;CONFIGURATION&amp;lt;/action-key&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;action-key&amp;gt;VIEW&amp;lt;/action-key&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;/supports&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;...&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;portlet-name&amp;gt;158&amp;lt;/portlet-name&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;permissions&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;supports&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;action-key&amp;gt;ADD_TO_PAGE&amp;lt;/action-key&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;action-key&amp;gt;CONFIGURATION&amp;lt;/action-key&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;action-key&amp;gt;VIEW&amp;lt;/action-key&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;&amp;lt;/supports&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;em&gt;...&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	When you're done, run ant deploy and restart your application server.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	And that's it! I hope I helped you&lt;/div&gt;
&lt;div&gt;
	Regards,&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Juan Fernández&lt;/div&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2011-08-30T18:58:27Z</dc:date>
  </entry>
  <entry>
    <title>Apoyando a Unicef en la campaña del Cuerno de África</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/apoyando-a-unicef-en-la-campana-del-cuerno-de-africa" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/apoyando-a-unicef-en-la-campana-del-cuerno-de-africa</id>
    <updated>2011-09-21T07:12:56Z</updated>
    <published>2011-08-18T10:16:19Z</published>
    <summary type="html">&lt;div&gt;
	¡Muy buenas!&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Esta vez no voy a escribir sobre liferay, ni siquiera sobre tecnología, sino sobre personas. Personas que como tú y como yo tienen sueños, proyectos, ilusiones...pero que han visto sus sueños truncados por una situación que les supera. Me refiero a la situación en el Cuerno de África.&lt;/div&gt;
&lt;div style="text-align: right;"&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div style="text-align: right;"&gt;
	&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=8cb1af43-7186-4a16-88f0-7e7f9dae7401&amp;amp;groupId=1373757&amp;amp;t=1313662241758" style="float: right; width: 423px; height: 173px;" /&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;div&gt;
		&lt;div&gt;
			Ya sabéis que más de medio millón de niños (sí, niños como tú lo fuiste, niños como tus hijos, o tus hermanos...) están en riesgo inminente de muerte debido a la desnutrición y cerca de 11 millones de personas en total están en una situación de riesgo ante la hambruna en la zona.&lt;/div&gt;
		&lt;div&gt;
			&amp;nbsp;&lt;/div&gt;
		&lt;div&gt;
			&amp;nbsp;&lt;/div&gt;
	&lt;/div&gt;
	&lt;div&gt;
		Viendo esta situación, y no queriendo quedarnos de brazos cruzados, desde las oficinas de Liferay España comenzamos una campaña para colaborar con Unicef ¿Te habías preguntado últimamente qué podías hacer tú para poder echar una mano? Pues esta es tu oportunidad de marcar la diferencia.&lt;/div&gt;
	&lt;div&gt;
		&amp;nbsp;&lt;/div&gt;
	&lt;div&gt;
		&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
	Las donaciones realizadas a través de este enlace quedarán registradas como relacionadas con Liferay y cuando acabe la campaña, nos comprometemos a igualar la donación recibida, de forma que si Unicef recibe por ejemplo 8.000€ en donaciones vía Liferay, nostros donaremos 8.000€ adicionales (hasta un máximo de 10.000€)&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Podéis donar haciendo click en el siguiente link: &lt;a href="http://www.unicef.es/cooperacion-internacional/donar-ong/hacer-donacion/emergencia-nutricional-en-el-cuerno-de-africa-liferay"&gt;donación a UNICEF para el cuerno de África&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Quería dejar constancia, a modo personal, de que antes de entrar a trabajar en Liferay no comprendía muy bien el significado de la tercera frase de nuestro eslogan ("Liferay: Enterprise. Open Source. For Life"): hoy creo que queda bastante claro.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Un saludo y muchas gracias,&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	Juan Fernández&lt;/div&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2011-08-18T10:16:19Z</dc:date>
  </entry>
  <entry>
    <title>The magic of the community</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/the-magic-of-the-community" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/the-magic-of-the-community</id>
    <updated>2010-10-28T08:35:00Z</updated>
    <published>2010-10-28T08:30:00Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;Hi all!&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Today, while I was reviewing bug and improvement requests tickets from the community members, I saw a ticket created by &lt;a href="http://www.liferay.com/web/swerlen/profile"&gt;Sven Werlen&lt;/a&gt; from &lt;a href="http://www.savoirfairelinux.com/"&gt;Savoir-faire Linux&lt;/a&gt;, a canadian company.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;They needed the asset publisher to be able to access and publish assets from all their communities and organizations and they've developed a hook that does this so that they can choose the scope in a wider way, and, here's&lt;strong&gt; the magic of the Liferay open source community&lt;/strong&gt;: they have decided to share it with all the community so they have published their hook in the community plugins repository (Link here: &lt;a href="http://www.liferay.com/downloads/liferay-portal/community-plugins/-/software_catalog/products/6268657"&gt;http://www.liferay.com/downloads/liferay-portal/community-plugins/-/software_catalog/products/6268657&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This is the kind of changes that we may not be interested in adding to the core but some of you may be interested in, and that's perfect for the community to share. I think this is great, to see that there are some companies and individual developers that are willing to share their expertise and experience with the rest of the community, and this is the starting point of the market place we are planning: a place where we can all share our plugins.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Things like this make me proud of working in an open source company like Liferay.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Thank you, guys&lt;/div&gt;&lt;div&gt;Juan Fernández&lt;/div&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-10-28T08:30:00Z</dc:date>
  </entry>
  <entry>
    <title>How to use the new Global Scope</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/how-to-use-the-new-global-scope" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/how-to-use-the-new-global-scope</id>
    <updated>2010-10-26T17:30:07Z</updated>
    <published>2010-10-26T15:53:20Z</published>
    <summary type="html">&lt;p&gt;Hi all:&lt;/p&gt;&lt;p&gt;In order to share content accross organizations and communities, we have included a new concept in Liferay 6.0: the &lt;strong&gt;global scope&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;img width="240" height="160" align="right" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=c4686de7-a953-4838-818f-f55d7791fd8a&amp;amp;groupId=1373757&amp;amp;t=1288108952272" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;The Global Scope is a place for data that is common to all organization, communities and users of the portal. It does not have associated pages and can only be accessed from the control panel.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;We have detected the most common use cases for the Global Repository, and this is an example of the most usual use cases:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;1 - &lt;strong&gt;Shared Web Content templates and structures&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;After creating a template or a structure in the global scope you can select them in all the other scopes (organizations and communities) of your company.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;To achieve this you just have to click on &amp;quot;advanced search&amp;quot; in the popup that appears when you select a template or a structure and select &amp;quot;Global&amp;quot; in the &amp;quot;My Places&amp;quot; dropdown menu.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;2 - &lt;strong&gt;Shared contents of any type for the Asset Publisher&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;You can configure the asset publisher so that it shows assets from the global scope. This way you can publish any of the supported asset types including the following:&lt;/p&gt; &lt;ul&gt;     &lt;li&gt;web content&lt;/li&gt;     &lt;li&gt;images&lt;/li&gt;     &lt;li&gt;blog entries&lt;/li&gt;     &lt;li&gt;documents&lt;/li&gt;     &lt;li&gt;bookmarks&lt;/li&gt;     &lt;li&gt;wiki pages&lt;/li&gt;     &lt;li&gt;calendar events&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;3 - &lt;strong&gt;Common asset categories&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Any categories vocabulary will be shown as an option when a user is selecting a category for all asset types in all organizations and communities.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;For the moment the Global content repository can only be administered by users with the &amp;quot;Administrator&amp;quot; role.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;We are thinking in new ways of sharing content through organizations and communities, and we are looking forward to hearing from you.&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;If you have any suggestions, post them in the &lt;a href="http://www.liferay.com/community/forums/-/message_boards/category/1108052"&gt;suggestions forums&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;[Note: I have created a &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Global+Scope"&gt;wiki page&lt;/a&gt; with this content so that we can all improve it]&lt;/p&gt; &lt;p&gt;[&lt;a href="http://www.flickr.com/photos/huge09"&gt;Pic credits&lt;/a&gt;]&lt;/p&gt; &lt;p&gt;Greetings!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-10-26T15:53:20Z</dc:date>
  </entry>
  <entry>
    <title>Sanitizers in Liferay 6</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/sanitizers-in-liferay-6" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/sanitizers-in-liferay-6</id>
    <updated>2010-07-26T12:35:40Z</updated>
    <published>2010-07-26T11:54:39Z</published>
    <summary type="html">&lt;p&gt;A new functionallity in &lt;strong&gt;Liferay 6&lt;/strong&gt; are the so called &amp;quot;&lt;strong&gt;Sanitizers&lt;/strong&gt;&amp;quot;.&amp;nbsp;&lt;img width="250" height="167" align="right" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=b923356c-6c7e-4ad9-a272-38eca5428c68&amp;amp;groupId=1373757&amp;amp;t=1280145768142" /&gt;&lt;/p&gt;&lt;div&gt;What are sanitizers? Sanitizers are a filtering element that &amp;quot;sanitize&amp;quot; web content (usually HTML or javascript code) so that it doesn't contain unappropiate content like javascript malicious code or swearwords, for example.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The portal.properties file has been updated with this entry:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;em&gt;sanitizer.impl=com.liferay.portal.sanitizer.DummySanitizerImpl&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;so that we can use our custom sanitizer.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For the moment it's being used in Blogs portlet out-of-the-box, just before entering the contents in the database, but this can be applied to whatever entity we need using plugins. For example you can use it in a Model Wrapper Hook for Wiki pages or a Model Wrapper Hook for web content.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There's already an&lt;strong&gt; antisamy hook&lt;/strong&gt; in plugins repository that is ready to be used and it can be used as an starting point for you developers that are interested in implementing your custom sanitizers. (Read more about the antisamy project &lt;a href="http://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project"&gt;here&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;To use this in core entities the best way is to use model wrapper hooks (read more about this kind of plugins &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Wrapper+Plugins"&gt;here&lt;/a&gt;), so that you include this filtering before creating the entity and its related objects (like tags, categories and so on)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;To create this hook, the fastest way is using &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Liferay+IDE"&gt;Liferay IDE&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Create a hook plugin project (&amp;quot;Liferay hook plug-in project&amp;quot;) and create a new hook portlet (&amp;quot;new hook plugin&amp;quot;) that overrides Services (mark &amp;quot;Services&amp;quot; checkbox) and then select the class you want to extend.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In this blog entry, I'll extend WikiPage creation, so my class is like this:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;package com.test.hooks;&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portal.kernel.exception.PortalException;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portal.kernel.exception.SystemException;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portal.kernel.sanitizer.SanitizerUtil;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portal.kernel.util.ContentTypes;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portal.service.ServiceContext;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portlet.wiki.model.WikiPage;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portlet.wiki.service.WikiPageLocalService;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;import com.liferay.portlet.wiki.service.WikiPageLocalServiceWrapper;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;public class ExtWikiPageLocalService extends WikiPageLocalServiceWrapper {&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;public ExtWikiPageLocalService(WikiPageLocalService wikiPageLocalService) {&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;super(wikiPageLocalService);&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;}&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;public WikiPage addPage(&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 120px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;long userId, long nodeId, String title, double version,&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 120px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;String content, String summary, boolean minorEdit, String format,&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 120px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;boolean head, String parentTitle, String redirectTitle,&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 120px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;ServiceContext serviceContext)&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;throws PortalException, SystemException {&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;// My Custom Code: sanitize the content&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;String sanitizedContent = SanitizerUtil.sanitize(&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;serviceContext.getCompanyId(), serviceContext.getScopeGroupId(),&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;userId, WikiPage.class.getName(), 0, ContentTypes.TEXT_HTML, content);&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;// Then launch Liferay method code&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;return super.addPage(userId, nodeId, title, version,&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;sanitizedContent, summary, minorEdit, format,&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;head, parentTitle, redirectTitle,&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;serviceContext);&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;}&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;}&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;And my &lt;strong&gt;liferay-hook.xml&lt;/strong&gt; is like this:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&amp;lt;!DOCTYPE hook PUBLIC &amp;quot;-//Liferay//DTD Hook 6.0.0//EN&amp;quot; &amp;quot;http://www.liferay.com/dtd/liferay-hook_6_0_0.dtd&amp;quot;&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&amp;lt;hook&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&amp;lt;service&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;&amp;lt;service-type&amp;gt;&lt;/em&gt;&lt;em&gt;com.liferay.portlet.wiki.service.WikiPageLocalService&lt;/em&gt;&lt;em&gt;&amp;lt;/service-type&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;&amp;lt;service-impl&amp;gt;&lt;/em&gt;&lt;em&gt;com.test.hooks.ExtWikiPageLocalService&lt;/em&gt;&lt;em&gt;&amp;lt;/service-impl&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&amp;lt;/service&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&lt;em&gt;&amp;lt;/hook&amp;gt;&lt;/em&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;After deploying antisamy hook, when you deploy your custom wrapper, the wiki content is verified in creation time so that it filters wiki page's content the way the antisamy does.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I hope it's been useful&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Regards!&lt;/div&gt;&lt;div&gt;Juan Fernández&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Credits:&lt;/div&gt;&lt;div&gt;thanks to &lt;a href="https://www.liferay.com/web/zsolt.balogh/profile"&gt;Zsolt Balogh&lt;/a&gt;&amp;nbsp;for his help &amp;amp; patience with sanitizers :D&lt;/div&gt;&lt;div&gt;&amp;nbsp;image from Flickr: &lt;a href="http://www.flickr.com/photos/loush555/2322773699/"&gt;http://www.flickr.com/photos/loush555/2322773699/&lt;/a&gt; (by El Tekolote)&lt;/div&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-07-26T11:54:39Z</dc:date>
  </entry>
  <entry>
    <title>Liferay Workflow In Action</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/liferay-workflow-in-action" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/liferay-workflow-in-action</id>
    <updated>2010-07-14T06:34:25Z</updated>
    <published>2010-07-13T10:28:23Z</published>
    <summary type="html">&lt;p&gt;Hi guys!&lt;br /&gt;&lt;br /&gt;One of the many great improvements of Liferay 6 is the &lt;strong&gt;workflow system&lt;/strong&gt;, as many of you already know. We have been working hard on it and we have developed lots of new functionallities that we're sure you'll &lt;strong&gt;love&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;In this blog post I'll implement a use case so that you can see workflow in action, and by the way, I announce that in the wiki we've created a series of articles that describe the workflow portlets and what are they for. You can read them by clicking in this wiki link: &lt;a href="http://www.liferay.com/es/community/wiki/-/wiki/Main/Workflow"&gt;http://www.liferay.com/es/community/wiki/-/wiki/Main/Workflow&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Intro:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In this example we will create the following users:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;Reader:&lt;/em&gt; this is a simple user that is a member of the community &amp;quot;&lt;em&gt;My Use Case Community&lt;/em&gt;&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;Content Writer:&lt;/em&gt; this is the content writer of the community. He's able to create web content&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;Content Reviewer:&lt;/em&gt; this is the person in charge of controling the content that is going to be published. He can decide if the web content is correct or not.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;Content Publicator&lt;/em&gt;: this is the member of the community that publishes content, add new applications to the community and so on.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;em&gt;Portal Admin:&lt;/em&gt; super user that will prepare the environment of this use case&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Configure the environment:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;With the portal admin, I create &amp;quot;&lt;em&gt;My Use Case Community&lt;/em&gt;&amp;quot; and the four users, which I assign to the community as new members.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Assign roles and permissions:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Assign the &amp;quot;&lt;em&gt;Community Content Reviewer&amp;quot;&lt;/em&gt; role (which is an autogenerated role from the workflow definition) to the user &amp;quot;&lt;em&gt;Content Reviewer&lt;/em&gt;&amp;quot;, so that he can review content&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Assign the &amp;quot;&lt;em&gt;Community Administrator&amp;quot;&lt;/em&gt; role to &amp;quot;&lt;em&gt;Content Publicator&amp;quot;&lt;/em&gt; so that he can manage everything in the community&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Create a new community role called &amp;quot;&lt;em&gt;Content Writer&amp;quot;&lt;/em&gt; and assign it to &amp;quot;&lt;em&gt;Content Writer&amp;quot;.&lt;/em&gt; This role would have web content's permissions (I don't usually give him &amp;quot;delete&amp;quot; and &amp;quot;permission&amp;quot; permissions, but that's up to you) and access in control panel, so that he can create web content from the control panel (this is not strictly necessary, as he can create web content from the asset publisher, for example)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Important: &lt;/strong&gt;Enable the workflow for this community's web contents: Go to &amp;quot;Control Panel&amp;quot;, &amp;quot;Workflow configuration&amp;quot; and select your workflow definition (by default kaleo provides &amp;quot;Single Approver&amp;quot; definition) in the &amp;quot;Web content&amp;quot; entry.&lt;br /&gt;&lt;br /&gt;Now, let's start working! &lt;img alt="" src="http://www.liferay.com/html/js/editor/fckeditor/editor/images/smiley/msn/teeth_smile.gif" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The workflow system in action:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.- Creating the content&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Login as the &amp;quot;Content Writer&amp;quot;, go to the control panel and create a new web content. Notice that the available buttons are &amp;quot;Save as draft&amp;quot; and &amp;quot;Submit for publication&amp;quot;, so that the user knows that he can't publish directly (by the way this is a good way to know that the workflow engine is correctly applied to your community). Click &amp;quot;Submit for publication&amp;quot;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img width="450" height="188" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9b9dc472-605b-4161-bf76-ba0d03163931&amp;amp;groupId=1373757&amp;amp;t=1279016845668" /&gt;&lt;br /&gt;&lt;br /&gt;In this moment, the workflow engine starts. The user can see that the content's status is &amp;quot;pending&amp;quot; and he can't modify the content till it's reviewed.&lt;br /&gt;From this moment on, the content writer can follow the process in the &amp;quot;My Submissions&amp;quot; portlet. There he can see the internal workflow status and if he realizes (for example) that he wants to modify something in the content, he can withdraw the submission.&lt;br /&gt;&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; &lt;strong&gt;2.- Reviewing the content&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It's time for the &amp;quot;Content Reviewer&amp;quot; to start working.&lt;br /&gt;The main part of the reviewer work is going to be done in the &amp;quot;My Workflow Tasks&amp;quot; portlet, so let's go there. &lt;br /&gt;In the &amp;quot;Assigned to my roles&amp;quot; view, you'd see the pending tasks and you can assign the task to another user or yourself.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9d17e04e-e1e3-49ef-9e89-9e1a5bcbe866&amp;amp;groupId=1373757&amp;amp;t=1279016845669" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I assign it to myself&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img width="520" height="464" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9677c64a-367d-40c7-b26c-39a269f06b7e&amp;amp;groupId=1373757&amp;amp;t=1279016845670" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the detail view of the task, you can view and edit the content, read the recent activity of the task, view the status and change its status (in this case approve or reject, but this would depend on the workflow definition)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img width="563" height="413" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=3dc59bef-16db-4046-a75d-5a97bad683a4&amp;amp;groupId=1373757&amp;amp;t=1279016845671" /&gt;&lt;br /&gt;&lt;br /&gt;In this moment, there are two possibilities:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a) The reviewer rejects the content: he writes the reason in a popup and the content goes back to the writer, so that he can edit/fix/improve it&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; b) The reviewer approves the content: he (maybe after editing the content so that it fits the portal's rules) approve the content and the content's status is updated to &amp;quot;approved&amp;quot;.&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;3.- Publish the content&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The user &amp;quot;Content Publicator&amp;quot;, that handles the portlets and has publishing rights, now can go to the community pages and add a web content display portlet with the new content in it&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;4.- Access the content&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The user &amp;quot;Reader&amp;quot; (who, remember, has no special permissions, but is a community member) is now able to view the new web content&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img width="700" height="200" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=bdef4ea6-d5ff-4264-a5b1-75ca1903cfc5&amp;amp;groupId=1373757&amp;amp;t=1279018560736" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Remember that, &lt;strong&gt;out-of-the-box,&lt;/strong&gt; liferay 6 provides the hability to enable workflow for these entities:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 1. Wiki Page&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 2. Web Content&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 3. Document Library Document&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 4. Blogs Entry&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 5. Comments&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 6. Message Boards Message &lt;br /&gt;&lt;br /&gt;And you can extend this functionallity to your custom portlets. &lt;br /&gt;&lt;br /&gt;We are looking forward to hearing your feedback!&lt;br /&gt;&lt;br /&gt;Regards, &lt;br /&gt;Juan Fernández&lt;br /&gt;Liferay Core Engineer&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-07-13T10:28:23Z</dc:date>
  </entry>
  <entry>
    <title>Liferay modules communication</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/liferay-modules-communication" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/liferay-modules-communication</id>
    <updated>2010-05-05T09:47:31Z</updated>
    <published>2010-04-22T10:24:48Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Hi guys:&lt;/p&gt;&lt;p&gt;when you start developing in Liferay you notice that there are many modules and libraries in its core, but there are not accessible from everywhere.&lt;/p&gt;&lt;p&gt;I recently found a problem developing an improvement for the workflow system (see &lt;a href="http://issues.liferay.com/browse/LPS-8821"&gt;http://issues.liferay.com/browse/LPS-8821&lt;/a&gt;), where I needed to use a class that I couldn't access... and I realized that I needed to know which concrete classes were reachable from where I was.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I have done a little research and I've written a &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Liferay+modules+communication"&gt;wiki article&lt;/a&gt; explaining this, and I have created a diagram to make it easier to understand:&lt;/p&gt;&lt;p&gt;&lt;img alt="diagram2" width="529" height="397" src="http://cdn.www.liferay.com/image/image_gallery?uuid=9d2eefbb-0835-41cd-ac97-b20b75b5ceb8&amp;amp;groupId=1373757&amp;amp;t=1271931825008" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I hope it'll be useful for you, developers!&lt;/p&gt;&lt;p&gt;Regards&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Juan Fernández&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;[&lt;strong&gt;IMPORTANT UPDATE&lt;/strong&gt;: This has recently changed for the current Liferay version - 6.0.2. portal-service and portal-kernel have been merged, so that it's much easier now to develop. See&amp;nbsp;&lt;a href="http://issues.liferay.com/browse/LPS-9370"&gt;http://issues.liferay.com/browse/LPS-9370&lt;/a&gt;&amp;nbsp;for further information]&lt;/p&gt;&lt;p&gt;&lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-04-22T10:24:48Z</dc:date>
  </entry>
  <entry>
    <title>Sample Expando Hook</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/sample-expando-hook" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/sample-expando-hook</id>
    <updated>2010-03-22T13:12:30Z</updated>
    <published>2010-03-22T13:02:26Z</published>
    <summary type="html">&lt;p&gt;Hi guys!&lt;/p&gt; &lt;div&gt;Last week I created the &lt;strong&gt;sample expando hook&lt;/strong&gt;, a simple example to show how easy is to extend portal entities on startup without using the UI.&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;The main goal of this work method is to allow Liferay users to extend portal entities from a plugin, so that they don't need to repeat the same action (the creation of new fields for their entities) in every installation they do.&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;You can find it ready to use in the plugins' hooks svn (&lt;strong&gt;http://svn.liferay.com/browse/plugins/trunk/hooks&lt;/strong&gt;)&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;I have based this development in this Ray's blog entry (&lt;strong&gt;http://www.liferay.com/web/raymond.auge/blog/-/blogs/adding-expandos-from-a-startup-hook&lt;/strong&gt;) and here's the explaination so that you can adapt it to your concrete use case:&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;In portal.properties you declare your class so that it is launched on startup:&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="margin-left: 40px; "&gt;application.startup.events=com.liferay.sampleexpando.hook.events.StartupAction&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;In StartupAction, in doRun, you do the main things:&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;1.- We get a reference of (or create) the table ExpandoTableConstants.DEFAULT_TABLE_NAME, determining the portal entity we are working with (in this case it'll be the calendar events - CalEvent)&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try { 			expandoTable = ExpandoTableLocalServiceUtil.addTable( 				CalEvent.class.getName(), 				ExpandoTableConstants.DEFAULT_TABLE_NAME); 		} 		catch (Exception e) { 			expandoTable = ExpandoTableLocalServiceUtil.getTable( 				CalEvent.class.getName(), 				ExpandoTableConstants.DEFAULT_TABLE_NAME); 		}&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;2.- We add the new column using a custom name (&amp;quot;sampleColumn&amp;quot;) and its type (ExpandoColumnConstants.STRING in this case):&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;ExpandoColumnLocalServiceUtil.addColumn(&lt;/div&gt; &lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;expandoTable.getTableId(), &amp;quot;sampleColumn&amp;quot;,&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;ExpandoColumnConstants.STRING);&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;And that's all!&lt;/div&gt; &lt;div&gt;I hope it'll be useful&lt;/div&gt; &lt;div&gt;Regards&lt;/div&gt; &lt;div&gt;Juan Fernández&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-03-22T13:02:26Z</dc:date>
  </entry>
  <entry>
    <title>Adding asset functionallity to Calendar Events</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/adding-asset-functionallity-to-calendar-events" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/adding-asset-functionallity-to-calendar-events</id>
    <updated>2010-02-11T09:44:44Z</updated>
    <published>2010-02-10T16:31:39Z</published>
    <summary type="html">&lt;p&gt;Liferay's objects are being encapsulated into assets (documents, web contents, blog entries are being encapsulated in the new asset concept) and it allows the portal objects to be treated in a consistent way.&lt;/p&gt;&lt;p&gt;There are several portlets that are designed to work with this kind of objects and you may be interested in doing this with your custom objects.&lt;/p&gt;&lt;p&gt;I have been working with the Calendar Events to add this functionallity for Liferay 6.0, and this blog entry is the result of that experience. This will allow us to tag and categorize calendar events, so that we can search them much easier, create them not only from the calendar but from the asset publisher and track the creation from several places.&lt;/p&gt;&lt;p&gt;If you have created a custom object (for example &amp;quot;school_teacher&amp;quot;) and you want to convert it into an asset, these are the steps to follow:&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In YourObjectLocalServiceImpl.java, in every CRUD &amp;nbsp;(create, read, update and delete) method, add a call to its respective asset method through the assetEntryLocalService object&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;BlogsEntryLocalServiceImpl example:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;public void deleteEntry(BlogsEntry entry)&amp;nbsp;throws PortalException, SystemException {&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;[...]&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;// Asset&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;assetEntryLocalService.deleteEntry(&amp;nbsp;BlogsEntry.class.getName(), entry.getEntryId());&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;[...]&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;To make your content available in the Asset Publisher Portlet you have to follow these steps&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Create the following classes:&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;YourObjectAssetRendererFactory (extends BaseAssetRendererFactory)&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;YourObjectAssetRenderer (extends BaseAssetRenderer)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In liferay-portlet.xml add this line to your portlet:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;lt;asset-renderer-factory&amp;gt;com.liferay.portlet.your_portlet.YourObjectAssetRendererFactory&amp;lt;/asset-renderer-factory&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In portal-web/yourPortlet create /asset/full_content.jsp with the content you want to see in Asset Publisher&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;And that's all! :)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Regards&lt;/div&gt;&lt;div&gt;Juan Fernández&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[Update]&lt;/div&gt;&lt;div&gt;I have created a wiki entry with this info here:&amp;nbsp;&lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Adding+asset+functionallity+to+your+portlets"&gt;www.liferay.com/community/wiki/-/wiki/Main/Adding+asset+functionallity+to+your+portlets&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[/Update]&lt;/div&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-02-10T16:31:39Z</dc:date>
  </entry>
  <entry>
    <title>CKEditor 3 integration for Liferay 6</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/ckeditor-3-integration-for-liferay-6" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/ckeditor-3-integration-for-liferay-6</id>
    <updated>2010-02-11T07:52:34Z</updated>
    <published>2010-02-10T09:23:50Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;Hi guys!&lt;/p&gt;&lt;p&gt;For the last few weeks I've been working in a new WYSIWYG editor for Liferay 6. It's the new version of FCKEditor, called &lt;strong&gt;CKEditor&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Which are the improvements of the new version? The main improve is accessibility: it is WAI-AA and WCAG 1.0 compliant. It implements advanced screen readerssupport, it's fully keyboard navigable, it has natural TAB key usage with tabindex support and operating system High Contrast support.&lt;/p&gt;&lt;p&gt;It is also compatible with most Internet browsers and operating systems, including Internet Explorer 6+, Firefox 2+, Safari 3+, Google Chrome and Opera 9.5+:&lt;/p&gt;&lt;p&gt;You can read more about its features in &lt;a href="http://ckeditor.com"&gt;their web&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And here you have a screenshot!&lt;/p&gt;&lt;p&gt;&lt;img width="454" height="385" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=be8e2eb6-9f3a-46ad-b494-ea3f77d0bfe5&amp;amp;groupId=1373757&amp;amp;t=1265795168083" /&gt;&lt;/p&gt;&lt;p&gt;isn't it beautiful? :)&lt;/p&gt;&lt;p&gt;Regards&lt;/p&gt;&lt;p&gt;Juan Fernández&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-02-10T09:23:50Z</dc:date>
  </entry>
  <entry>
    <title>Liferay Wrapper Plugins</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/liferay-wrapper-plugins" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/liferay-wrapper-plugins</id>
    <updated>2010-02-10T09:22:40Z</updated>
    <published>2010-02-09T15:47:03Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;Hi guys:&lt;/p&gt;&lt;div&gt;this week I have been working in the &lt;strong&gt;Asset Importer&lt;/strong&gt;, a portlet that reads a file (odt for the moment) and converts it into a web content so that you can publish your documents an your website.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;We will use this to publish Liferay documentation in Liferay.com very soon&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Developing this portlet I had to use for the first time a &lt;strong&gt;wrapper plugin&lt;/strong&gt;. This is a variation of the hook plugin that allows you to extend core functionallity by creating a wrapper for a concrete core class... and there's no documentation at all, so that's why I'm writing this! :)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In my case I needed to do a few things everytime the user deletes a journal article, so here you have how I did it:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: larger; "&gt;How to use Liferay's Wrapper Plugins&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Note: I'll use a example that extends JournalArticle deletion to be more illustrative.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The steps to do to use this functionallity are the following:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Create a file called liferay-hook.xml with the following content and place it docroot/WEB-INF:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;!DOCTYPE hook PUBLIC &amp;quot;-//Liferay//DTD Hook 5.2.5//EN&amp;quot; &amp;quot;http://www.liferay.com/dtd/liferay-hook_5_2_0.dtd&amp;quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;lt;hook&amp;gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;lt;service&amp;gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&amp;lt;service-type&amp;gt;com.liferay.portlet.journal.service.JournalArticleLocalService&amp;lt;/service-type&amp;gt;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;&amp;lt;service-impl&amp;gt;com.liferay.portlet.asset.service.impl.JournalArticleLocalServiceWrapperImpl&amp;lt;/service-impl&amp;gt;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;lt;/service&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/hook&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The first class is the service you want to extend&lt;/div&gt;&lt;div&gt;The second class is the one that implements the modifications&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Create a class that extends the wrapper you want to use and add the basic constructor (in my case it is&amp;nbsp;JournalArticleLocalServiceWrapper):&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;public class JournalArticleLocalServiceWrapperImpl&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;extends JournalArticleLocalServiceWrapper {&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;public JournalArticleLocalServiceWrapperImpl(JournalArticleLocalService journalArticleLocalService) {&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;super(journalArticleLocalService);&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;}&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Add the methods you want to overwrite in that class:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;public void deleteArticle(long groupId, java.lang.String articleId,&amp;nbsp;double version,&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;java.lang.String articleURL,&amp;nbsp;com.liferay.portal.service.ServiceContext serviceContext)&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;throws com.liferay.portal.PortalException,&amp;nbsp;com.liferay.portal.SystemException {&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="margin-left: 80px; "&gt;[... all my custom code here...]&lt;/div&gt;&lt;div style="margin-left: 40px; "&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;And that's all: you deploy your portlet/plugin and you'll see it in action!&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;By the way, you have a great example by Brian Chan in the test-hook-portlet&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Regards&lt;/div&gt;&lt;div&gt;Juan Fernández&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;ps: I have created a &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Wrapper+Plugins"&gt;wiki page&lt;/a&gt; with this entry in the development section&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-02-09T15:47:03Z</dc:date>
  </entry>
  <entry>
    <title>My first post!</title>
    <link rel="alternate" href="http://www.liferay.com/web/juan.fernandez/blog/-/blogs/my-first-post!" />
    <author>
      <name>Juan Fernández</name>
    </author>
    <id>http://www.liferay.com/web/juan.fernandez/blog/-/blogs/my-first-post!</id>
    <updated>2010-02-02T10:40:15Z</updated>
    <published>2010-02-02T10:34:52Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;Hi, guys!&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It's already been a month since I started working in the Liferay team, in the spanish office and I wanted to write a presentation post.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;When I was part of the community I sometimes missed knowing what was going on in the Liferay team: &amp;quot;What are they doing at this moment?&amp;quot;, so I want my blog to be somehow that answer (at least on what concerns my work!)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;These last weeks I have been involved in CKEditor integration for Liferay 6 and I've been working along with Jorge Ferrer in a new Asset Importer Portlet and the new Asset Link concept: I'm sure you'll like this!&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I'm interested in the community and I'm working to make the best of it. I'd like to improve communication and participation, improve documentation, organization, promote feedback in the forums, etc.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I'm also focusing my interest in cloud computing, and soon I'll be writing about this and how can Liferay approach Cloud Computing (or not! :D)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Read you soon&lt;/div&gt;&lt;div&gt;Juan Fernández&lt;/div&gt;&lt;div&gt;Liferay Spain&lt;/div&gt;</summary>
    <dc:creator>Juan Fernández</dc:creator>
    <dc:date>2010-02-02T10:34:52Z</dc:date>
  </entry>
</feed>


