<?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>Edward Shin</title>
  <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/rss" />
  <subtitle>Edward Shin</subtitle>
  <entry>
    <title>Upgrading Your EXT Environment to an EXT Plugin</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/upgrading-your-ext-environment-to-an-ext-plugin" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/upgrading-your-ext-environment-to-an-ext-plugin</id>
    <updated>2010-10-06T19:18:48Z</updated>
    <published>2010-03-10T06:14:00Z</published>
    <summary type="html">&lt;p&gt;Update: Please see the official documentation here:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/ext-plugins"&gt;www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/ext-plugins&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now that we have EXT Plugins, the million dollar question is what will happen to the EXT Environment?&lt;/p&gt; &lt;p&gt;First, let's cover the bad news. The EXT Environment will no longer exist in Liferay 6.0.&lt;/p&gt; &lt;p&gt;For those of you that use the EXT Environment primarily to change core code, this is a good thing because EXT Plugins handle core customizations better than the EXT Environment. You'll spend less time deploying and maintaining your changes with EXT plugins.&amp;nbsp;See&amp;nbsp;&lt;a href="https://www.liferay.com/web/edward.shin/blog/-/blogs/introducing-ext-plugins%21?_33_redirect=%2Fweb%2Fedward.shin%2Fblog"&gt;Introducing EXT Plugins!&lt;/a&gt;&amp;nbsp;for more information.&lt;/p&gt; &lt;p&gt;For those of you (like me) that have made heavy customizations in the EXT Environment including&amp;nbsp;custom portlets and services, you're probably a little nervous about this change.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The good news is that we have a script to help migrate your EXT Environments to EXT Plugins.&lt;/p&gt; &lt;p&gt;You can find the build.xml script in the Plugins SDK in trunk in the &amp;quot;ext&amp;quot; directory:&lt;br /&gt; svn://svn.liferay.com/repos/public/plugins/trunk/ext&lt;/p&gt; &lt;p&gt;What the script does is create an EXT Plugin from the ext.zip file and merge in your changes from your EXT Environment.&lt;/p&gt; &lt;p&gt;Let's take a look at how this works in practice.&lt;/p&gt; &lt;p&gt;Assuming that your EXT Environment is located in /Users/ed/projects/ext:&lt;br /&gt; (The Windows equivalent would be C:/projects/ext)&lt;/p&gt; &lt;p&gt;&lt;img width="425" height="388" alt="" src="http://www.liferay.com/image/image_gallery?uuid=92f78a94-5f72-4a3a-b92e-e0ef2e588345&amp;amp;groupId=11305&amp;amp;t=1268204052309" /&gt;&lt;/p&gt; &lt;p&gt;We can run the following command to migrate the code from the EXT Environment to EXT Plugins:&lt;br /&gt; ant upgrade-ext -Dext.dir=/Users/ed/projects/ext -Dext.name=hello-world -Dext.display.name=&amp;quot;Hello World&amp;quot;&lt;/p&gt; &lt;p&gt;Where:&lt;br /&gt; -Dext.dir is a command line argument to the location of the EXT Environment&lt;br /&gt; -Dext.name is the name of the EXT Plugin that you want to create&lt;br /&gt; -Dext.display.name is the display name (See&amp;nbsp;liferay-plugin-package.properties)&lt;/p&gt; &lt;p&gt;&lt;img width="607" height="353" alt="" src="http://www.liferay.com/image/image_gallery?uuid=e5acc726-62bf-4766-81f3-caf1195aa375&amp;amp;groupId=11305&amp;amp;t=1268204964975" /&gt;&lt;/p&gt; &lt;p&gt;This will create a hello-world-ext directory with the merged changes from your EXT Environment.&lt;/p&gt; &lt;p&gt;&lt;img width="601" height="111" alt="" src="http://www.liferay.com/image/image_gallery?uuid=35f4d5c6-8f82-4279-9245-f066b24a9a88&amp;amp;groupId=11305&amp;amp;t=1268205306156" /&gt;&lt;/p&gt; &lt;p&gt;Both build-service (ServiceBuilder) and build-db (DBBuilder) have been ported to EXT Plugins to allow developers to regenerate their services and SQL code in EXT Plugins:&lt;/p&gt; &lt;p&gt;&lt;img width="610" height="410" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=56313c51-eff5-463c-9c19-1a9792e32950&amp;amp;groupId=11305&amp;amp;t=1268205914680" /&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;img width="609" height="378" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=fff8b069-1e27-44b3-beb8-3b0051651702&amp;amp;groupId=11305&amp;amp;t=1268206271327" /&gt;&lt;/p&gt; &lt;p&gt;But as noted in the warning message, ServiceBuilder in EXT plugins will be deprecated in future versions, and custom services should be migrated to portlet plugins. Try to migrate your custom services to portlet plugins as soon as possible as this is the recommended practice.&lt;/p&gt; &lt;p&gt;Additional Notes:&lt;/p&gt; &lt;p&gt;1. &amp;quot;build-services&amp;quot; in the above example is a custom target. You can define custom targets like this in order to make them work properly with Service Builder:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&amp;lt;target name=&amp;quot;build-service-test&amp;quot;&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;&amp;lt;antcall target=&amp;quot;build-service&amp;quot;&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;&amp;lt;param name=&amp;quot;service.file&amp;quot; value=&amp;quot;docroot/WEB-INF/ext-impl/src/com/test/service.xml&amp;quot; /&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		&lt;/span&gt;&amp;lt;/antcall&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;&amp;lt;/target&amp;gt;&lt;/p&gt; &lt;div&gt;2. If you're using a version of Liferay that uses ext-ejb instead of ext-impl, you must first upgrade to Liferay 5.2 before migrating your code to an EXT Plugin.&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2010-03-10T06:14:00Z</dc:date>
  </entry>
  <entry>
    <title>Creating Your First EXT Plugin</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/creating-your-first-ext-plugin" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/creating-your-first-ext-plugin</id>
    <updated>2010-10-06T19:19:23Z</updated>
    <published>2010-03-10T02:42:12Z</published>
    <summary type="html">&lt;p&gt;Update: Please see the official documentation here:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/ext-plugins"&gt;www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/ext-plugins&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The first step that we need to take is to &amp;quot;Check Out&amp;quot; or download the Plugins SDK here:&lt;br /&gt;svn://svn.liferay.com/repos/public/plugins/trunk&lt;/p&gt;&lt;p&gt;You'll have to know how to use an SVN client to check out the latest Plugins SDK, but you'll be able to download it from our website once we release 6.0.&lt;/p&gt;&lt;p&gt;I'll include some screenshots in case you just want a general idea of how it works before it's released.&lt;/p&gt;&lt;p&gt;After checking out the new Plugins SDK, you'll notice that there's a new &amp;quot;ext&amp;quot; directory available:&lt;/p&gt;&lt;p&gt;&lt;img width="615" height="207" alt="" src="http://www.liferay.com/image/image_gallery?uuid=dd9195b2-93b7-4f09-9acf-5f43347cd5d3&amp;amp;groupId=11305&amp;amp;t=1268189674970" /&gt;&lt;/p&gt;&lt;p&gt;- We can create a hello-world-ext plugin using the the following command for Unix:&lt;br /&gt;./create.sh hello-world &amp;quot;Hello World&amp;quot;&lt;/p&gt;&lt;p&gt;Or the following command for Windows:&lt;br /&gt;create hello-world &amp;quot;Hello World&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;img width="608" height="168" alt="" src="http://www.liferay.com/image/image_gallery?uuid=31f32bb0-2083-4f36-a49e-80d463f6fbea&amp;amp;groupId=11305&amp;amp;t=1268195158946" /&gt;&lt;/p&gt;&lt;p&gt;This will create a hello-world-ext plugin which should look like this:&lt;/p&gt;&lt;p&gt;&lt;img width="685" height="206" alt="" src="http://www.liferay.com/image/image_gallery?uuid=e2f96fd6-d219-4f2a-903c-658ff0ba9aef&amp;amp;groupId=11305&amp;amp;t=1268195334796" /&gt;&lt;/p&gt;&lt;p&gt;Notice the similarities with the EXT Environment:&lt;/p&gt;&lt;p&gt;&lt;img width="672" height="181" alt="" src="http://www.liferay.com/image/image_gallery?uuid=a583df9f-c904-4d90-93ec-51089e9aa77f&amp;amp;groupId=11305&amp;amp;t=1268195414922" /&gt;&lt;/p&gt;&lt;p&gt;- Now let's run an &amp;quot;ant clean&amp;quot;:&lt;/p&gt;&lt;p&gt;&lt;img width="609" height="402" alt="" src="http://www.liferay.com/image/image_gallery?uuid=f146e10b-91ba-4257-a09c-6dd122228717&amp;amp;groupId=11305&amp;amp;t=1268190653685" /&gt;&lt;/p&gt;&lt;p&gt;We get this error message because we haven't defined any of the properties:&lt;/p&gt;&lt;p&gt;app.server.zip.name is the location of the zipped server bundle&lt;br /&gt;ext.work.dir is the location where you want to unzip your server&lt;br /&gt;app.server.dir is the location of your server directory&lt;/p&gt;&lt;p&gt;We'll need these properties so that ant knows the location of the app.server.dir (server directory), the location of the app.server.zip.name (zipped server bundle) and the ext.work.dir (location where you want to unzip your server).&lt;/p&gt;&lt;p&gt;- You can create your own zipped Tomcat bundle by reading my blog post here:&lt;br /&gt;&lt;a href="https://www.liferay.com/web/edward.shin/blog/-/blogs/building-a-tomcat-bundle-from-liferay-trunk?_33_redirect=%2Fweb%2Fedward.shin%2Fblog"&gt;Building a Tomcat Bundle from Liferay trunk&lt;/a&gt;&lt;/p&gt;&lt;p&gt;- Once you've created your zipped Tomcat bundle, you can point your &amp;quot;app.server.zip.name&amp;quot; property to it like this:&lt;br /&gt;app.server.zip.name=/Users/ed/liferay/portal/dist/liferay-portal-tomcat-6.0.0.zip&lt;/p&gt;&lt;p&gt;&lt;img width="656" height="244" alt="" src="http://www.liferay.com/image/image_gallery?uuid=17e5c154-0be9-4558-98c3-edb5843f1a89&amp;amp;groupId=11305&amp;amp;t=1268191365304" /&gt;&lt;/p&gt;&lt;p&gt;- Create your build.${user.name}.properties file here:&lt;/p&gt;&lt;p&gt;&lt;img width="436" height="305" alt="" src="http://www.liferay.com/image/image_gallery?uuid=5acd64b9-d0a7-4dce-99cf-1d5a7c54c2b9&amp;amp;groupId=11305&amp;amp;t=1268192324389" /&gt;&lt;/p&gt;&lt;p&gt;- Set the location of your properties. I've set mine as follows:&lt;/p&gt;&lt;p&gt;&lt;img width="605" height="85" alt="" src="http://www.liferay.com/image/image_gallery?uuid=66fc1131-b7bf-4b9f-a861-98bdae6869f4&amp;amp;groupId=11305&amp;amp;t=1268192896935" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That's all you need to do to set up the environment!&lt;/p&gt;&lt;p&gt;To recap, all we've done so far is set up 3 properties for the location of our server, the location of our zipped server bundle and the directory that we want to unzip the bundle to.&lt;/p&gt;&lt;p&gt;Now we can see how this works in action:&lt;/p&gt;&lt;p&gt;Running &amp;quot;ant clean&amp;quot; will now delete the server directory and unzip a clean copy of our zipped server bundle:&lt;/p&gt;&lt;p&gt;&lt;img width="610" height="225" alt="" src="http://www.liferay.com/image/image_gallery?uuid=21f3ea87-72a2-4864-b50d-bb3b54f90185&amp;amp;groupId=11305&amp;amp;t=1268196250805" /&gt;&lt;/p&gt;&lt;p&gt;Running &amp;quot;ant compile&amp;quot; will compile all the necessary ext code.&lt;/p&gt;&lt;p&gt;&lt;img width="447" height="180" alt="" src="http://www.liferay.com/image/image_gallery?uuid=6d412bd0-2675-4fa2-8332-6ac265eec0cc&amp;amp;groupId=11305&amp;amp;t=1268194211967" /&gt;&lt;br /&gt;&lt;br /&gt;Running &amp;quot;ant war&amp;quot; will create /plugins/dist/hello-world-ext-5.3.0.1.war&lt;/p&gt;&lt;p&gt;&lt;img width="611" height="201" alt="" src="http://www.liferay.com/image/image_gallery?uuid=16ec8fb7-8f32-4117-af25-6f9d1e3a9c49&amp;amp;groupId=11305&amp;amp;t=1268196346157" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img width="647" height="200" alt="" src="http://www.liferay.com/image/image_gallery?uuid=eacabdb9-1914-4e0c-9613-36eee7d4ce8b&amp;amp;groupId=11305&amp;amp;t=1268196436631" /&gt;&lt;/p&gt;&lt;p&gt;You can hot deploy this war to a running Liferay bundle. It'll tell you to reboot after the ext plugin has been deployed (since you're changing core classes):&lt;/p&gt;&lt;p&gt;&lt;img width="657" height="100" alt="" src="http://www.liferay.com/image/image_gallery?uuid=441aa985-638a-40e8-8b10-30f763cd85c7&amp;amp;groupId=11305&amp;amp;t=1268196599744" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img width="611" height="131" alt="" src="http://www.liferay.com/image/image_gallery?uuid=dbe0a64a-0df7-4630-a5f4-f1d9b910b139&amp;amp;groupId=11305&amp;amp;t=1268196723031" /&gt;&lt;/p&gt;&lt;p&gt;After creating your own hello-world-ext plugin,&amp;nbsp;you'll now see how much lighter EXT Plugins is compared to the EXT Environment. Try modifying a few classes to see how it works in practice.&lt;/p&gt;&lt;p&gt;(Keep in mind that EXT plugins are designed to override the portal's core code that&amp;nbsp;cannot be done with hooks, layout templates, portlets, or themes. EXT plugins&amp;nbsp;are not meant to contain new custom services.)&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2010-03-10T02:42:12Z</dc:date>
  </entry>
  <entry>
    <title>Introducing EXT Plugins!</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/introducing-ext-plugins!" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/introducing-ext-plugins!</id>
    <updated>2010-04-01T23:04:16Z</updated>
    <published>2010-03-09T02:58:15Z</published>
    <summary type="html">&lt;p&gt;&amp;nbsp;Like many great ideas in Liferay, EXT&amp;nbsp;Plugins came from our community. This idea is credited to the company IBA CZ.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; "&gt;Rather than have a monolithic structure&amp;nbsp;(EXT environment)&amp;nbsp;that modifies the entire portal, we can now modify all of Liferay's core classes using EXT Plugins. Unlike the EXT Environment,&amp;nbsp;EXT Plugins don't require the entire portal code (portal-impl.jar, portal-web.war, etc.) and have a smaller footprint since they only contain the differences / deltas.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; "&gt;This makes it much easier to extend and maintain changes to Liferay core and is more powerful since we can modify&amp;nbsp;util-java and util-taglib which wasn't possible before.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; "&gt;This move is huge and drive us towards our goal of having a light weight core with modularized components that will be easy to develop, maintain and plug into other instances of Liferay.&amp;nbsp;&lt;/p&gt;&lt;p&gt;More information is available at the following links:&lt;br /&gt;http://issues.liferay.com/browse/LPS-5203&lt;br /&gt;http://issues.liferay.com/browse/LPS-6341&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2010-03-09T02:58:15Z</dc:date>
  </entry>
  <entry>
    <title>Building a Tomcat Bundle from Liferay trunk</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/building-a-tomcat-bundle-from-liferay-trunk" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/building-a-tomcat-bundle-from-liferay-trunk</id>
    <updated>2010-10-06T19:21:48Z</updated>
    <published>2010-03-09T02:24:42Z</published>
    <summary type="html">&lt;p&gt;Update October 6, 2010: Now that we've officially packaged the bundles for Liferay 6 in both our CE and EE releases, you can now download the bundles from liferay.com instead of building them from scratch. This blog was based on an ongoing revision of trunk so some of the steps will be outdated at this time.&lt;/p&gt;&lt;p&gt;If you've ever wondered which Tomcat bundle to use when deploying Liferay trunk, you can actually build your own using build-dist.xml. This step is the first one needed to check out the new Plugins EXT environment.&lt;/p&gt;&lt;p&gt;In the past, I used to download the latest version of our Tomcat bundle from our website, but using build-dist.xml is easier and requires less steps.&amp;nbsp;Once Liferay 6.0 is released, you'll be able to download the bundle directly from our website.&lt;/p&gt;&lt;p&gt;You can download trunk here using an svn client:&lt;br /&gt;svn://svn.liferay.com/repos/public/portal/trunk&lt;/p&gt;&lt;p&gt;From the Liferay trunk directory, you can run:&lt;br /&gt;ant all&lt;/p&gt;&lt;p&gt;And then:&lt;br /&gt;ant -buildfile build-dist.xml zip-tomcat&lt;/p&gt;&lt;p&gt;Assuming that you checked out Liferay trunk to the following directory:&lt;/p&gt;&lt;p&gt;&lt;img width="401" height="440" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=3d15cd36-6c1d-454e-b949-6d4edf7f9773&amp;amp;groupId=11305&amp;amp;t=1268103006003" /&gt;&lt;/p&gt;&lt;p&gt;Running the commands will look something like this:&lt;/p&gt;&lt;p&gt;&lt;img width="499" height="258" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=f7368da9-2fa6-4a8c-bba6-7e4f07d655ca&amp;amp;groupId=11305&amp;amp;t=1268103398277" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img width="537" height="172" alt="" src="http://cdn.www.liferay.com/image/image_gallery?uuid=1add033d-4138-4d26-b007-f13093462eed&amp;amp;groupId=11305&amp;amp;t=1268102886122" /&gt;&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2010-03-09T02:24:42Z</dc:date>
  </entry>
  <entry>
    <title>Desktop Theme Updated for Liferay 5.0!</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/desktop-theme-updated-for-liferay-5-0!" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/desktop-theme-updated-for-liferay-5-0!</id>
    <updated>2008-04-29T03:55:37Z</updated>
    <published>2008-04-28T22:54:19Z</published>
    <summary type="html">&lt;p&gt;In addition to being visually appealing, the Desktop Theme shows the depth to which Liferay themes can be customized. A lot of work has been done to overhaul the css and javascript, so even if you've already seen version 1.0, it's worth taking another look.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Mac:&lt;/p&gt;&lt;p&gt;&lt;img height="483" alt="" width="628" src="http://www.liferay.com/image/image_gallery?img_id=740959&amp;amp;t=1209421919938" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Vista:&lt;/p&gt;&lt;p&gt;&lt;img height="487" alt="" width="615" src="http://www.liferay.com/image/image_gallery?img_id=740963&amp;amp;t=1209421919938" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Linux:&lt;/p&gt;&lt;p&gt;&lt;img height="485" alt="" width="622" src="http://www.liferay.com/image/image_gallery?img_id=740967&amp;amp;t=1209421919938" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;One of the interesting aspects of the theme is that the above screenshots are implemented as color schemes. Each color scheme contains the custom css and images that are different than the base theme. This was made possible by some enhancements made by Nate Cavanaugh and Brian Chan:&lt;/p&gt;&lt;p&gt;&lt;img height="486" alt="" width="628" src="http://www.liferay.com/image/image_gallery?img_id=740999&amp;amp;t=1209421919940" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Here are some additional features available in the Desktop theme. Sliding arrow:&lt;/p&gt;&lt;p&gt;&lt;img height="402" alt="" width="626" src="http://www.liferay.com/image/image_gallery?img_id=740971&amp;amp;t=1209423195182" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Embedding the&amp;nbsp;Analog Clock and Date into the Add Content menu:&lt;/p&gt;&lt;p&gt;&lt;img height="485" alt="" width="622" src="http://www.liferay.com/image/image_gallery?img_id=740975&amp;amp;t=1209423095004" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Taskbar that highlights the selected portlet in the taskbar and brings it to the front of the screen:&lt;/p&gt;&lt;p&gt;&lt;img height="485" alt="" width="622" src="http://www.liferay.com/image/image_gallery?img_id=740979&amp;amp;t=1209423095007" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Address Bar: Community &amp;gt; Page &amp;gt; Portlet:&lt;/p&gt;&lt;p&gt;&lt;img height="485" alt="" width="622" src="http://www.liferay.com/image/image_gallery?img_id=740983&amp;amp;t=1209423095011" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Hide all configuration icons&amp;nbsp;other than&amp;nbsp;minimize, maximize and close except on hover:&lt;/p&gt;&lt;p&gt;&lt;img height="491" alt="" width="627" src="http://www.liferay.com/image/image_gallery?img_id=740987&amp;amp;t=1209423095013" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Customized warning message when the session is expired:&lt;/p&gt;&lt;p&gt;&lt;img height="487" alt="" width="628" src="http://www.liferay.com/image/image_gallery?img_id=740995&amp;amp;t=1209423095016" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;The theme has&amp;nbsp;also been tested to work on&amp;nbsp;ie6, ie7&amp;nbsp;and ff.&amp;nbsp;If you like this theme, let us know about it, so that we continue to invest time and make improvements to it.&lt;/p&gt;&lt;p&gt;&amp;nbsp;(Please&amp;nbsp;send&amp;nbsp;any bugs/requests to Peter Shin, the designer of the theme: &lt;a href="http://www.liferay.com/web/pshin/home"&gt;http://www.liferay.com/web/pshin/home&lt;/a&gt;)&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2008-04-28T22:54:19Z</dc:date>
  </entry>
  <entry>
    <title>Struts WAR Tutorial covering Database Operations, Validation and Permissions</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/struts-war-tutorial-covering-database-operations-validation-and-permissions" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/struts-war-tutorial-covering-database-operations-validation-and-permissions</id>
    <updated>2008-02-18T05:08:51Z</updated>
    <published>2008-02-12T00:28:27Z</published>
    <summary type="html">&lt;p&gt;1-action-forward - Contains the basic files needed to display a JSP. Describes key aspects of the core files.&lt;/p&gt;&lt;p&gt;&lt;img height="84" alt="" width="421" src="http://www.liferay.com/image/image_gallery?img_id=487578&amp;amp;t=1203260551676" /&gt;&lt;/p&gt;&lt;p&gt;2-tiles - Covers tiles, adding the portlet to a category and internationalization.&lt;/p&gt;&lt;p&gt;&lt;img height="89" alt="" width="425" src="http://www.liferay.com/image/image_gallery?img_id=487582&amp;amp;t=1203260551676" /&gt;&lt;/p&gt;&lt;p&gt;3-render - Add an action class, the render method and a renderURL&lt;/p&gt;&lt;p&gt;&lt;img height="96" alt="" width="427" src="http://www.liferay.com/image/image_gallery?img_id=487586&amp;amp;t=1203260551676" /&gt;&lt;/p&gt;&lt;p&gt;4-processAction - Add processAction and validation&lt;/p&gt;&lt;p&gt;&lt;img height="265" alt="" width="278" src="http://www.liferay.com/image/image_gallery?img_id=487590&amp;amp;t=1203260551677" /&gt;&lt;/p&gt;&lt;p&gt;5-service-builder - Covers Liferay's Service Builder, adding business logic and adding an entry to the database. The SQL required to create the table is provided with the source code.&lt;/p&gt;&lt;p&gt;&lt;img height="98" alt="" width="417" src="http://www.liferay.com/image/image_gallery?img_id=487594&amp;amp;t=1203260551677" /&gt;&lt;/p&gt;&lt;p&gt;6-update-delete - Add update/delete methods and the Action menu button&lt;/p&gt;&lt;p&gt;&lt;img height="246" alt="" width="432" src="http://www.liferay.com/image/image_gallery?img_id=487598&amp;amp;t=1203260551677" /&gt;&lt;/p&gt;&lt;p&gt;7. Permissions - Coming Soon!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img height="201" alt="" width="513" src="http://www.liferay.com/image/image_gallery?img_id=488277&amp;amp;t=1203310618498" /&gt;&lt;/p&gt;&lt;p&gt;Tutorials and source code are available at the top of the page. Comments/Questions? Feedback is welcome! &lt;a href="http://www.liferay.com/web/guest/community/forums/message_boards/message/473735"&gt;http://www.liferay.com/web/guest/community/forums/message_boards/message/473735&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This tutorial covers how to develop a struts war that performs the basic add, update and delete operations. The first step to learning something new is to strip out any unnecessary components until you're left with just the basic functionality. You'll end up breaking things along the way, but you'll have a very good idea of how everything works&amp;nbsp;at the end.&lt;/p&gt;&lt;p&gt;I started off with the sample-struts-liferay-portlet.war, and stripped out all unnecessary functionality until I was left with a portlet that could&amp;nbsp;only display a JSP. The original sample-struts-liferay-portlet.war is available here:&lt;br /&gt;&lt;a href="http://www.liferay.com/web/guest/downloads/official_plugins"&gt;http://www.liferay.com/web/guest/downloads/official_plugins&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In order to deploy the files, you'll need to download the Liferay Plugins SDK located here:&lt;br /&gt;&lt;a href="http://www.liferay.com/web/guest/downloads/additional"&gt;http://www.liferay.com/web/guest/downloads/additional&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And one of the Liferay Tomcat bundles here:&lt;br /&gt;&lt;a href="http://www.liferay.com/web/guest/downloads/portal"&gt;http://www.liferay.com/web/guest/downloads/portal&lt;/a&gt;&lt;br /&gt;(If you don't know which one to use, get the Recommended Download.)&lt;/p&gt;&lt;p&gt;You'll also need to create a build.${user.name}.properties that points to your server.&lt;br /&gt;For example, I have a build.ed.properties file with the following entry:&lt;br /&gt;app.server.dir=D:/tomcat&lt;br /&gt;(If you don't know how to do this, ask in our forums for some additional help.)&lt;/p&gt;&lt;p&gt;One thing to note is that the examples will only work on tomcat because&amp;nbsp;they use the PortalClassLoader. However, the key concepts like internationalization, page flow, validation, database operations (Service Builder) and permissions will be the same. After you go through this tutorial, you&amp;nbsp;will&amp;nbsp;be able to&amp;nbsp;port the same concepts to the sample-struts-portlet.war which uses the Apache Struts Bridge or any other framework including JSF or Spring.&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2008-02-12T00:28:27Z</dc:date>
  </entry>
  <entry>
    <title>WebDAV</title>
    <link rel="alternate" href="http://www.liferay.com/it/web/edward.shin/blog/-/blogs/webdav" />
    <author>
      <name>Edward Shin</name>
    </author>
    <id>http://www.liferay.com/it/web/edward.shin/blog/-/blogs/webdav</id>
    <updated>2007-10-26T18:48:57Z</updated>
    <published>2007-10-26T18:19:02Z</published>
    <summary type="html">&lt;p&gt;I needed to upload some docs to our Document Library today, so I decided to give WebDAV a try instead of uploading each document one by one. I heard that our WebDAV implementation was buggy, so I wasn't looking forward to it, but I thought i'd give it a try anyways.&lt;br /&gt;&lt;br /&gt;To my pleasant surprise, it worked pretty well! There were a few catches, I wasn't sure what&amp;nbsp;to put in for my username&amp;nbsp;and I wasn't able to create new folders, but I was able to bulk upload my documents! (For those of you who are interested, the username&amp;nbsp;is the numeric User ID.)&lt;br /&gt;&lt;br /&gt;Here's our wiki on WebDAV:&lt;br /&gt;&lt;a href="http://wiki.liferay.com/index.php/Accessing_the_Document_Library_with_WebDAV#How_to_Login"&gt;http://wiki.liferay.com/index.php/Accessing_the_Document_Library_with_WebDAV#How_to_Login&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All that we have to do now is allow users to create new folders, and WebDAV will be really good!&lt;/p&gt;</summary>
    <dc:creator>Edward Shin</dc:creator>
    <dc:date>2007-10-26T18:19:02Z</dc:date>
  </entry>
</feed>

