<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Guest</title>
    <link>http://blog.d-vel.com/web/blog/home/-/blogs/rss</link>
    <description>Guest</description>
    <item>
      <title>Introduzione agli Hooks: primo episodio</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/introduzione-agli-hooks:-primo-episodio</link>
      <description>&lt;p&gt;&lt;!--[if !mso]&gt;
&lt;style&gt;
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:DocumentProperties&gt;
  &lt;o:Revision&gt;0&lt;/o:Revision&gt;
  &lt;o:TotalTime&gt;0&lt;/o:TotalTime&gt;
  &lt;o:Pages&gt;1&lt;/o:Pages&gt;
  &lt;o:Words&gt;2246&lt;/o:Words&gt;
  &lt;o:Characters&gt;12803&lt;/o:Characters&gt;
  &lt;o:Company&gt;Shirus&lt;/o:Company&gt;
  &lt;o:Lines&gt;106&lt;/o:Lines&gt;
  &lt;o:Paragraphs&gt;30&lt;/o:Paragraphs&gt;
  &lt;o:CharactersWithSpaces&gt;15019&lt;/o:CharactersWithSpaces&gt;
  &lt;o:Version&gt;14.0&lt;/o:Version&gt;
 &lt;/o:DocumentProperties&gt;
 &lt;o:OfficeDocumentSettings&gt;
  &lt;o:AllowPNG /&gt;
 &lt;/o:OfficeDocumentSettings&gt;
&lt;/xml&gt;&lt;![endif]--&gt;  &lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves&gt;false&lt;/w:TrackMoves&gt;
  &lt;w:TrackFormatting /&gt;
  &lt;w:PunctuationKerning /&gt;
  &lt;w:ValidateAgainstSchemas /&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF /&gt;
  &lt;w:LidThemeOther&gt;IT&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;JA&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables /&gt;
   &lt;w:SnapToGridInCell /&gt;
   &lt;w:WrapTextWithPunct /&gt;
   &lt;w:UseAsianBreakRules /&gt;
   &lt;w:DontGrowAutofit /&gt;
   &lt;w:SplitPgBreakAndParaMark /&gt;
   &lt;w:EnableOpenTypeKerning /&gt;
   &lt;w:DontFlipMirrorIndents /&gt;
   &lt;w:OverrideTableStyleHps /&gt;
   &lt;w:UseFELayout /&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math" /&gt;
   &lt;m:brkBin m:val="before" /&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
   &lt;m:smallFrac m:val="off" /&gt;
   &lt;m:dispDef /&gt;
   &lt;m:lMargin m:val="0" /&gt;
   &lt;m:rMargin m:val="0" /&gt;
   &lt;m:defJc m:val="centerGroup" /&gt;
   &lt;m:wrapIndent m:val="1440" /&gt;
   &lt;m:intLim m:val="subSup" /&gt;
   &lt;m:naryLim m:val="undOvr" /&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="276"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
  &lt;w:LsdException Locked="false" Priority="0" Name="page number" /&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;  &lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:Cambria;
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:minor-latin;
	mso-ansi-language:IT;}
table.MsoTableGrid
	{mso-style-name:"Table Grid";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-priority:59;
	mso-style-unhide:no;
	border:solid windowtext 1.0pt;
	mso-border-alt:solid windowtext .5pt;
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-border-insideh:.5pt solid windowtext;
	mso-border-insidev:.5pt solid windowtext;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:Cambria;
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:minor-latin;
	mso-ansi-language:IT;
	mso-fareast-language:JA;}
&lt;/style&gt;
&lt;![endif]--&gt;    &lt;!--StartFragment--&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;L&amp;rsquo;insediamento dell&amp;rsquo;&lt;i&gt;Open Source&lt;/i&gt; nel mondo del cosiddetto &lt;i&gt;Enterprise&lt;/i&gt; prosegue in modo inesorabile ma alcune organizzazioni sono ancora restie all&amp;rsquo;adozione di software &lt;i&gt;Open Source&lt;/i&gt; e hanno delle giustificate ragioni. La manutenzione delle personalizzazioni (da riesaminare per ogni nuova release) è uno dei motivi che giustifica questa diffidenza nei confronti dei software &lt;i&gt;Open &lt;/i&gt;Source.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Ipotizziamo per un attimo di poter &lt;i&gt;&amp;ldquo;agganciare tramite un arpione&amp;rdquo; &lt;/i&gt;le personalizzazioni implementate senza toccare il core del software, direi che sarebbe un&amp;rsquo;operazione fantastica, bene, Liferay ha introdotto di recente un nuovo tipo di &lt;i&gt;plugin&lt;/i&gt; che prende per l&amp;rsquo;appunto il nome di &lt;i&gt;Liferay Hooks &lt;w:sdt citation="t" id="-1901209987"&gt;&lt;!--[if supportFields]&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
 style='font-family:"Times New Roman";font-style:normal'&gt;&lt;span
 style="mso-spacerun:yes"&gt; &lt;/span&gt;CITATION Lif121 \l 1040 &lt;/span&gt;&lt;span
 style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:
&amp;quot;Times New Roman&amp;quot;;font-style:normal;mso-no-proof:yes"&gt;(Liferay Inc, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;/i&gt;&lt;/span&gt;. Questa nuova via di &lt;i&gt;estensione&lt;/i&gt; fornisce un livello di separazione tra le vostre personalizzazioni e il core di Liferay, diminuendo drasticamente la complessità di personalizzazione, introducendo inoltre una notevole libertà di movimento senza la preoccupazione di dover tener tracciata del codice sorgente a ogni release del core di Liferay.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Restando nell&amp;rsquo;orto delle personalizzazioni, un'altra strada &amp;ldquo;più larga&amp;rdquo; da percorrere in scenari complessi, dove gli altri tipi di &lt;i&gt;plugin&lt;/i&gt; non arrivano, si chiama &lt;i&gt;Liferay Ext&lt;/i&gt; &lt;w:sdt citation="t" id="-1116590331"&gt;&lt;!--[if supportFields]&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
 style='font-family:"Times New Roman"'&gt;&lt;span
 style="mso-spacerun:yes"&gt; &lt;/span&gt;CITATION Lif12 \l 1040 &lt;/span&gt;&lt;span
 style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:
&amp;quot;Times New Roman&amp;quot;;mso-no-proof:yes"&gt;(Liferay Inc, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;/span&gt;. La trattazione di questa &amp;ldquo;bestia&amp;rdquo; non è però oggetto di quest&amp;rsquo;articolo, magari di un futuro.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;A questo punto direi che sia venuto il momento di scrutare più da vicino gli &lt;i&gt;hooks&lt;/i&gt; e per quali scopi possano essere utilizzati, per poi immediatamente saltare alla realizzazione pratica di un &lt;i&gt;hook &lt;/i&gt;per personalizzare Liferay. &lt;i&gt;&lt;u&gt;La versione di riferimento di Liferay è la 6.1 edizione Community Edition.&lt;/u&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;1.&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Obiettivo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;L&amp;rsquo;articolo intende comunicare le informazioni base che riguardano gli &lt;i&gt;hooks&lt;/i&gt; favorendo l&amp;rsquo;aspetto reale, in altre parole, far capire a cosa servono tramite l&amp;rsquo;esposizione e realizzazione di un caso di studio quanto più possibile vicino al reale. Sarà quindi presentato un caso d&amp;rsquo;integrazione che farà uso degli &lt;i&gt;hooks,&lt;/i&gt; toccando i vari aspetti di personalizzazione. L&amp;rsquo;articolo sarà suddiviso in più episodi per evitare una &amp;ldquo;sbrodolata&amp;rdquo; d&amp;rsquo;informazione e rendere più efficace l&amp;rsquo;assimilazione di quanto esposto.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;2.&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Gli Hook in breve&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Che cosa sono gli &lt;i&gt;hooks&lt;/i&gt;? Il nome è più che azzeccato, in effetti, sono parti di codice &lt;i&gt;&amp;ldquo;agganciate&amp;rdquo;&lt;/i&gt; a Liferay che in genere sovrascrivono alcune delle funzioni del portale. &amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Tramite questo tipo di &lt;i&gt;plugin&lt;/i&gt; è possibile per gli sviluppatori sovrascrivere parti del core di Liferay con le proprie implementazioni, mantenendo una netta separazione tra il codice personalizzato e il core di Liferay. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Qualcuno potrebbe giustamente obiettare con una domanda del tipo: perché non utilizzare l&amp;rsquo;&lt;i&gt;Ext plugin&lt;/i&gt;? Poiché l&amp;rsquo;&lt;i&gt;Ext plugin&lt;/i&gt; fornisce l&amp;rsquo;accesso completo alle parti interne del core di Liferay, il codice personalizzato diventerebbe strettamente accoppiato a particolari implementazioni di funzioni interne che spesso potrebbero cambiare da una release a un&amp;rsquo;altra, basterebbe quindi un semplice cambio di &lt;i&gt;firma&lt;/i&gt; di un metodo per causare un gran mal di testa a colui il quale deve riesaminare il codice personalizzato. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Così come &lt;i&gt;portlet, theme, layout&lt;/i&gt; e così via,&lt;i&gt; &lt;/i&gt;anche gli &lt;i&gt;hooks&lt;/i&gt; sono &lt;/span&gt;&lt;i&gt;hot-deployable&lt;a href="#_ftn1" name="_ftnref1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;
mso-hansi-theme-font:minor-latin;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;
mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA"&gt;[1]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;, &lt;span lang="IT"&gt;quindi aggiungere e rimuovere è un&amp;rsquo;operazione semplice. La possibilità di suddividere funzionalità complesse in più &lt;i&gt;hook&lt;/i&gt;, sviluppati da persone diverse, rende dinamico l&amp;rsquo;ambiente di sviluppo e inoltre l&amp;rsquo;uso del set di &lt;i&gt;API &lt;/i&gt;pubbliche di Liferay per la scrittura dell&amp;rsquo;&lt;i&gt;hook&lt;/i&gt; rende semplice la revisione del codice personalizzato grazie alla corretta segnalazione dei &lt;i&gt;deprecati&lt;/i&gt;. &amp;nbsp;Gli &lt;i&gt;hooks&lt;/i&gt; sono stati progettati per superare molte delle limitazioni dell&amp;rsquo;&lt;i&gt;Ext&lt;/i&gt; e i punti di &lt;i&gt;estensione&lt;/i&gt; disponibili crescono a ogni release di Liferay anche grazie ai feedback ricevuti da parte degli utenti. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&amp;nbsp;Come fare a scegliere lo strumento di estensione più adeguato? Utilizzare gli &lt;i&gt;hook&lt;/i&gt; dove possibile. Sono più semplici da implementare, installare, rimuovere e manutenere. Ricorre all&amp;rsquo;uso dell&amp;rsquo;&lt;i&gt;Ext&lt;/i&gt; &lt;w:sdt citation="t" id="1971548130"&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span style='font-family:"Times New Roman"'&gt;&lt;span
 style="mso-spacerun:yes"&gt; &lt;/span&gt;CITATION Lif12 \l 1040 &lt;/span&gt;&lt;span
 style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:
&amp;quot;Times New Roman&amp;quot;;mso-no-proof:yes"&gt;(Liferay Inc, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;/span&gt;&lt;i&gt; &lt;/i&gt;solo nel caso in cui ciò che è richiesto non può essere soddisfatto tramite &lt;i&gt;hook&lt;/i&gt;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Nel prossimo paragrafo vedremo ciò che è possibile personalizzare tramite &lt;i&gt;hook&lt;/i&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;3.&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Cos&amp;rsquo;è possibile personalizzare tramite Hook&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;La strada consigliata per la personalizzazione delle funzioni base di Liferay, sono gli &lt;i&gt;hooks &lt;w:sdt citation="t" id="-162851649"&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span style='font-family:"Times New Roman";
 font-style:normal'&gt;&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;CITATION Lif121 \l
 1040 &lt;/span&gt;&lt;span style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:&amp;quot;Times New Roman&amp;quot;;font-style:normal;mso-no-proof:yes"&gt;(Liferay  Inc, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;/i&gt;&lt;/span&gt;. Tramite gli &lt;i&gt;hooks&lt;/i&gt; è possibile coprire un ampio spettro di necessità e dovrebbero essere utilizzati al posto dell&amp;rsquo;&lt;i&gt;Ext&lt;/i&gt;, quando possibile. Gli &lt;i&gt;hooks&lt;/i&gt; sono stati progettati per personalizzare fondamentalmente cinque caratteristiche principali del portale:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Portal properties&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Language properties&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol;mso-ansi-language:EN-US"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Web Resources&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol;mso-ansi-language:EN-US"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Performing custom actions&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Services&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Come per le portlet, layout e temi, anche gli &lt;i&gt;hooks&lt;/i&gt; sono creati e gestiti utilizzando il Plugin SDK&lt;a href="#_ftn2" name="_ftnref2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;
mso-hansi-theme-font:minor-latin;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;
mso-bidi-theme-font:minor-bidi;mso-ansi-language:IT;mso-fareast-language:EN-US;
mso-bidi-language:AR-SA"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Nella trattazione degli &lt;i&gt;hooks&lt;/i&gt; e in particolare del caso di studio illustrato in seguito, vedremo i seguenti aspetti che saranno suddivisi in episodi diversi:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:
Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Portal properties&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:
Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Performing custom action&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:
Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Web Resources&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:
Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Servlet filter hook&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="margin-left:64.35pt;mso-add-space:
auto;text-align:justify;text-justify:inter-ideograph;text-indent:-18.0pt;
mso-list:l2 level1 lfo8"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;4.&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Creazione di un hook&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Gli &lt;i&gt;hooks&lt;/i&gt; risiedono all&amp;rsquo;interno della directory hooks del Plugin SDK. Esistono vari metodi che potete utilizzare per creare i vostri &lt;i&gt;hooks&lt;/i&gt; alcuni dei quali sono:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Developer Studio&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Comando &lt;i&gt;create&lt;/i&gt; del Plugin SDK&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Apache Maven&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Per maggiori approfondimenti sulla creazione degli &lt;i&gt;hooks&lt;/i&gt; fare riferimento a &lt;w:sdt citation="t" id="-779951995"&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span style='font-family:"Times New Roman"'&gt;&lt;span
 style="mso-spacerun:yes"&gt; &lt;/span&gt;CITATION Lif122 \l 1040 &lt;/span&gt;&lt;span
 style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:
&amp;quot;Times New Roman&amp;quot;;mso-no-proof:yes"&gt;(Liferay Inc, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;/span&gt; per i primi due punti mentre per l&amp;rsquo;ultimo consiglio la &amp;nbsp;consultazione di &lt;w:sdt citation="t" id="-1747567660"&gt;&lt;!--[if supportFields]&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
 style='font-family:"Times New Roman"'&gt;CITATION Mik12 \l 1040 &lt;/span&gt;&lt;span
 style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:
&amp;quot;Times New Roman&amp;quot;;mso-no-proof:yes"&gt;(Koivisto, Getting started with Liferay  Maven SDK, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;, &lt;w:sdt citation="t" id="-1566099449"&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span style='font-family:"Times New Roman"'&gt;CITATION
 Koi12 \l 1040 &lt;/span&gt;&lt;span style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:&amp;quot;Times New Roman&amp;quot;;mso-no-proof:yes"&gt;(Koivisto, Developing  Liferay Plugins with Maven, 2012)&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;w:sdt citation="t" id="840039871"&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span style='font-family:"Times New Roman"'&gt;CITATION
 Ant12 \l 1040 &lt;/span&gt;&lt;span style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span style="font-family:&amp;quot;Times New Roman&amp;quot;;mso-no-proof:yes"&gt;&amp;nbsp;(Musarra, 2012)&lt;/span&gt;&lt;/w:sdt&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;w:sdt citation="t" id="840039871"&gt;&lt;!--[if supportFields]&gt;&lt;span
 style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;/w:sdt&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;5.&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Caso d&amp;rsquo;integrazione tramite Hook&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Gli &lt;i&gt;hooks&lt;/i&gt; possono essere molto efficaci nelle soluzioni d&amp;rsquo;integrazione tra Liferay e altri sistemi esterni. In questo paragrafo vedremo come poter sfruttare gli &lt;i&gt;hooks&lt;/i&gt; come punto &amp;ldquo;d&amp;rsquo;intermediazione&amp;rdquo; tra Liferay e un sistema di CRM. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype
 id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
 path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;
 &lt;v:stroke joinstyle="miter" /&gt;
 &lt;v:formulas&gt;
  &lt;v:f eqn="if lineDrawn pixelLineWidth 0" /&gt;
  &lt;v:f eqn="sum @0 1 0" /&gt;
  &lt;v:f eqn="sum 0 0 @1" /&gt;
  &lt;v:f eqn="prod @2 1 2" /&gt;
  &lt;v:f eqn="prod @3 21600 pixelWidth" /&gt;
  &lt;v:f eqn="prod @3 21600 pixelHeight" /&gt;
  &lt;v:f eqn="sum @0 0 1" /&gt;
  &lt;v:f eqn="prod @6 1 2" /&gt;
  &lt;v:f eqn="prod @7 21600 pixelWidth" /&gt;
  &lt;v:f eqn="sum @8 21600 0" /&gt;
  &lt;v:f eqn="prod @7 21600 pixelHeight" /&gt;
  &lt;v:f eqn="sum @10 21600 0" /&gt;
 &lt;/v:formulas&gt;
 &lt;v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /&gt;
 &lt;o:lock v:ext="edit" aspectratio="t" /&gt;
&lt;/v:shapetype&gt;&lt;v:shape id="Picture_x0020_2" o:spid="_x0000_i1031" type="#_x0000_t75"
 style='width:4in;height:152pt;visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="file://localhost/Users/amusarra/Library/Caches/TemporaryItems/msoclip/0/clip_image001.emz"
  o:title="" /&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img width="514" height="284" src="http://blog.d-vel.com/image/image_gallery?uuid=b1d4be3e-7920-4327-8404-2c7089541e8b&amp;amp;groupId=12536&amp;amp;t=1368473883979" v:shapes="Picture_x0020_2" alt="Macro architettura d&amp;rsquo;integrazione tra Liferay e CRM" /&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229584320"&gt;&lt;span lang="IT"&gt;Figura &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229584320'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229584320'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Figura \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;1&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229584320'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Macro architettura d&amp;rsquo;integrazione tra Liferay e CRM. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;La macro architettura d&amp;rsquo;integrazione mostrata in &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229584320 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 1&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380034003300320030000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; illustra chiaramente quali sono gli elementi interessati dal caso d&amp;rsquo;integrazione proposto. Volutamente sono stati evidenziati in nero gli elementi che riguardano il CRM per porre l&amp;rsquo;accento sul fatto che devono essere considerati vere e proprie scatole nere e concentrare l&amp;rsquo;attenzione verso gli &lt;i&gt;hooks&lt;/i&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2 style="margin-left:38.0pt;text-indent:-20.0pt;mso-list:l4 level2 lfo1"&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2 style="margin-left:38.0pt;text-indent:-20.0pt;mso-list:l4 level2 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;5.1&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Ipotesi d&amp;rsquo;integrazione&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Alcuni degli utenti memorizzati su Liferay (che accedono al portale) sono clienti dell&amp;rsquo;ipotetica azienda &lt;i&gt;Dontesta Corporation Ltd&lt;/i&gt; (che vende prodotti per l&amp;rsquo;equitazione) e le schede commerciali dei clienti sono registrate sul sistema interno di CRM. Non necessariamente gli utenti definiti su Liferay sono clienti dell&amp;rsquo;azienda e di conseguenza gestiti sul CRM. L&amp;rsquo;esigenza dell&amp;rsquo;azienda è di dare la possibilità d&amp;rsquo;accesso diretto alle schede dei contatti e aziende direttamente dal portale Liferay. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="Picture_x0020_1" o:spid="_x0000_i1030" type="#_x0000_t75" style='width:415pt;
 height:164pt;visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="file://localhost/Users/amusarra/Library/Caches/TemporaryItems/msoclip/0/clip_image003.png"
  o:title="" /&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img width="748" height="295" src="http://blog.d-vel.com/image/image_gallery?uuid=78dbd2e5-e81f-416f-a1e9-d80ee7e2b9dc&amp;amp;groupId=12536&amp;amp;t=1368474065991" v:shapes="Picture_x0020_1" alt="Esempio di UI per accesso alle schede CRM del contatto e azienda" /&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229581371"&gt;&lt;span lang="IT"&gt;Figura &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229581371'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229581371'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Figura \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;2&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229581371'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Esempio di UI per accesso alle schede CRM del contatto e azienda.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Il mockup&lt;a href="#_ftn3" name="_ftnref3" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:12.0pt;font-family:
Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;quot;ＭＳ 明朝&amp;quot;;
mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[3]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/a&gt; illustrato in &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229581371 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 1&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380031003300370031000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; è un buon esempio di come l&amp;rsquo;interfaccia utente su Liferay si dovrebbe presentare agli utenti per consentire loro l&amp;rsquo;accesso alle schede del CRM. Con un po&amp;rsquo; d&amp;rsquo;occhio è possibile notare come il mockup di &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229581371 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 1&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380031003300370031000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; è spudoratamente vicinissimo alla lista &lt;i&gt;Utenti e Organizzazioni&lt;/i&gt; accessibile da pannello di controllo di Liferay.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Garantire l&amp;rsquo;accesso alle schede (contatto e azienda) si traduce nella necessità di poter memorizzare alcuni dati presenti sul CRM come attributi aggiuntivi dell&amp;rsquo;utente Liferay. I dati da prelevare dal sistema di CRM sono:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;L&amp;rsquo;identificativo del contatto;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;L&amp;rsquo;identificativo dell'azienda cui il contatto appartiene.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;I dati sopra menzionati sono indispensabili per comunicare al CRM quale contatto o azienda s&amp;rsquo;intende visualizzare. L&amp;rsquo;accesso ai dati del CRM da parte di Liferay avviene tramite la scatola nera &lt;i&gt;CRM Integration API&lt;/i&gt; indicata nel diagramma di &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229584320 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 1&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380034003300320030000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2 style="margin-left:38.0pt;text-indent:-20.0pt;mso-list:l4 level2 lfo1"&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2 style="margin-left:38.0pt;text-indent:-20.0pt;mso-list:l4 level2 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;5.2&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Dove memorizzare i dati del CRM&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;E&amp;rsquo; plausibile pensare ai dati provenienti dal CRM come estensione del modello &lt;i&gt;utente&lt;/i&gt; di Liferay, d&amp;rsquo;altronde questi dati arricchiscono l&amp;rsquo;utente di altre informazioni. Liferay mette a nostra disposizione uno strumento davvero potente che consente facilmente di realizzare quanto pensato e illustrato in &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229587913 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 3&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380037003900310033000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="_x0000_i1029" type="#_x0000_t75" style='width:306pt;height:108pt;
 visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="file://localhost/Users/amusarra/Library/Caches/TemporaryItems/msoclip/0/clip_image005.png"
  o:title="" /&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img width="619" height="218" src="http://blog.d-vel.com/image/image_gallery?uuid=f6fef402-9554-4d4a-b6a4-b3a4ce5bd1d2&amp;amp;groupId=12536&amp;amp;t=1368474159815" v:shapes="_x0000_i1029" alt="Modello Utente Liferay esteso" /&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229587913"&gt;&lt;span lang="IT"&gt;Figura &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229587913'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229587913'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Figura \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;3&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229587913'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Modello Utente Liferay esteso.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Sicuramente il nome di &lt;i&gt;campi personalizzati&lt;/i&gt; (o &lt;a href="http://blog.d-vel.com/web/blog/home/-/blogs/expandotable-sulle-vostre-entita-custom!" target="_blank" id="custom-fields-in-liferay-6" title="Custom Fields in Liferay 6"&gt;custom fields&lt;/a&gt;) non suona del tutto nuovo, bene, questo è lo strumento con il quale definire sul modello &lt;i&gt;utente&lt;/i&gt; due nuovi attributi (topic &lt;i&gt;Extended CRM Attribute&lt;/i&gt; di &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229587913 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 3&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380037003900310033000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;) specificandone anche il tipo:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span lang="IT"&gt;ContactId&lt;/span&gt;&lt;/b&gt;&lt;span lang="IT"&gt;: attributo di tipo stringa il cui valore è l&amp;rsquo;identificativo (UUID&lt;a href="#_ftn4" name="_ftnref4" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:12.0pt;font-family:
Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;quot;ＭＳ 明朝&amp;quot;;
mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[4]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/a&gt;) del contatto sul sistema di CRM;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span lang="IT"&gt;AccountId&lt;/span&gt;&lt;/b&gt;&lt;span lang="IT"&gt;: attributo di tipo stringa il cui valore è l&amp;rsquo;identificativo (UUID) dell&amp;rsquo;azienda cui il contatto appartiene;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify; margin-left: 40px;"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;I due nuovi attributi creati per il modello &lt;i&gt;utente&lt;/i&gt; di Liferay conterranno quindi i valori necessari per recuperare in seguito le informazioni di dettaglio del contatto e azienda. &amp;nbsp;In &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229671432 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 4&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003600370031003400330032000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; è mostrato il dettaglio di un utente e in particolare sono evidenziati i valori dei due attributi &lt;i&gt;ContactId&lt;/i&gt; e &lt;i&gt;AccountId&lt;/i&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="_x0000_i1028" type="#_x0000_t75" style='width:252pt;height:240pt;
 visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="file://localhost/Users/amusarra/Library/Caches/TemporaryItems/msoclip/0/clip_image007.png"
  o:title="" /&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img width="448" height="428" src="http://blog.d-vel.com/image/image_gallery?uuid=2885a365-c391-4fb7-9888-0536c6be4e6d&amp;amp;groupId=12536&amp;amp;t=1368474321631" v:shapes="_x0000_i1028" alt="Dettaglio dell&amp;rsquo;utente con particole vista degli attributi CRM" /&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229671432"&gt;&lt;span lang="IT"&gt;Figura &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229671432'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229671432'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Figura \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;4&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229671432'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Dettaglio dell&amp;rsquo;utente con particole vista degli attributi CRM.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2 style="margin-left:38.0pt;text-indent:-20.0pt;mso-list:l4 level2 lfo1"&gt;&amp;nbsp;&lt;/h2&gt; &lt;h2 style="margin-left:38.0pt;text-indent:-20.0pt;mso-list:l4 level2 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;5.3&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Quando e come memorizzare i dati del CRM&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Direi che siamo arrivati al punto interessante del caso d&amp;rsquo;integrazione. E&amp;rsquo; stato definito l&amp;rsquo;obiettivo, i dati del CRM cui accedere e quale strumento utilizzare per memorizzare questi ultimi, non resta che altro che scoprire quando accedere al CRM per recuperare i dati di nostro interesse e come memorizzarli su i due nuovi attributi definiti in precedenza.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Il portale Liferay supporta un gran numero di eventi che accadono in certe situazioni e tramite &lt;i&gt;hook&lt;/i&gt; è possibile quindi eseguire una o più azioni personalizzate (&lt;/span&gt;&lt;i&gt;performing custom actions&lt;/i&gt;) al&lt;span lang="IT"&gt; verificarsi di un determinato evento. Le azioni che sono eseguite per ognuno degli eventi supportati dal portale, sono definite nel file di configurazione &lt;i&gt;portal.properties&lt;/i&gt;. Attraverso l&amp;rsquo;&lt;i&gt;hook&lt;/i&gt; dovremmo quindi:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Estendere il file di configurazione &lt;i&gt;portal.properties&lt;/i&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Creare la nuova azione da eseguire per un determinato evento. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify; margin-left: 40px;"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Il tipo di evento che calza a pennello con il nostro caso d&amp;rsquo;integrazione è di &lt;i&gt;user login&lt;/i&gt; e in particolare l&amp;rsquo;evento &lt;i&gt;login post action&lt;/i&gt;. Quest&amp;rsquo;evento è idoneo per eseguire l&amp;rsquo;azione di recupero e memorizzazione dei dati &lt;i&gt;ContactId&lt;/i&gt; e &lt;i&gt;AccountId&lt;/i&gt;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="Picture_x0020_7" o:spid="_x0000_i1027" type="#_x0000_t75" style='width:415pt;
 height:102pt;visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="file://localhost/Users/amusarra/Library/Caches/TemporaryItems/msoclip/0/clip_image009.png"
  o:title="" /&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img width="1020" height="254" src="http://blog.d-vel.com/image/image_gallery?uuid=318dce1b-a3ab-4093-8791-f8940a05b778&amp;amp;groupId=12536&amp;amp;t=1368474120234" v:shapes="Picture_x0020_7" alt="Processo di login sul portale Liferay" /&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229757856"&gt;&lt;span lang="IT"&gt;Figura &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229757856'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229757856'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Figura \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;5&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229757856'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Processo di login sul portale Liferay.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Il processo mostrato in &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229757856 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 5&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003700350037003800350036000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; rende più chiaro il processo di login. Il diagramma mostra solamente la parte di processo di nostro interesse. L&amp;rsquo;evento di &lt;i&gt;login post action &lt;/i&gt;è scatenato nel momento in cui è stato accertato che l&amp;rsquo;utente abbia inserito le corrette credenziali, a quel punto tramite l&amp;rsquo;&lt;i&gt;Event Processor&lt;/i&gt; sono eseguite tutte le azioni definite dalla proprietà &lt;/span&gt;&lt;i&gt;login.events.post&lt;/i&gt;. &lt;span lang="IT"&gt;Il file &lt;i&gt;portal.properties&lt;/i&gt; del nostro &lt;i&gt;hook&lt;/i&gt;, dovrebbe contenere la configurazione mostrata al &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229758940 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Listato 1&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003700350038003900340030000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border: none;"&gt;     &lt;tbody&gt;         &lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes;
            height:99.55pt"&gt;             &lt;td width="426" valign="top" style="width:425.8pt;border:solid windowtext 1.0pt;
            mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt;height:99.55pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;##&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:
            Monaco;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;## Portal Events&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;##&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:
            Monaco;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:
            8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;color:#3F7F5F;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;#&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:
            8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;color:#3F7F5F;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;# Login event&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:
            8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;color:#3F7F5F;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;#&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; login.events.post=&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            color:#2A00FF;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;it.dontesta.liferay.portal.events.LoginPostAction&lt;/span&gt;&lt;span style="font-size:14.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt; &lt;/table&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229758940"&gt;&lt;span lang="IT"&gt;Listato &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229758940'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229758940'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Listato \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;1&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229758940'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Definizione dell&amp;rsquo;azione da eseguire all&amp;rsquo;evento di login post action.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm;tab-stops:1.0cm"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm;tab-stops:1.0cm"&gt;&lt;span lang="IT"&gt;L&amp;rsquo;azione da eseguire nel momento in cui avviene l&amp;rsquo;evento, è una classe che estende la classe astratta &lt;i&gt;com.liferay.portal.kernel.events.Action&lt;/i&gt; di cui occorre implementare il metodo &lt;/span&gt;&lt;i&gt;com.liferay.portal.kernel.events.Action#run()&lt;/i&gt;. &lt;span lang="IT"&gt;Ricordo che non siamo limitati a specificare una sola classe.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm;tab-stops:1.0cm"&gt;&lt;span lang="IT"&gt;All&amp;rsquo;interno del metodo &lt;i&gt;run()&lt;/i&gt; andrà inserito il codice necessario per eseguire i seguenti task:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
tab-stops:1.0cm"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Recupero dell&amp;rsquo;utente che ha eseguito con successo il login;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 80px; text-align: justify; text-indent: -10.35pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Prendere contatto con il CRM presentandosi con le credenziali dell&amp;rsquo;utente che ha appena eseguito il login;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 80px; text-align: justify; text-indent: -10.35pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Recupero i dati d&amp;rsquo;interesse dal CRM, che ricordo essere, il &lt;i&gt;ContactId&lt;/i&gt; e l&amp;rsquo;&lt;i&gt;AccountId&lt;/i&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle" style="text-align: justify; text-indent: -18pt; margin-left: 40px;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Recupero l&amp;rsquo;&lt;i&gt;E&lt;/i&gt;&lt;/span&gt;&lt;i&gt;xpando Bridge&lt;a href="#_ftn5" name="_ftnref5" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;
mso-hansi-theme-font:minor-latin;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;
mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA"&gt;[5]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/a&gt;&lt;/i&gt; sul modello dell&amp;rsquo;utente;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast" style="margin-left: 80px; text-align: justify; text-indent: -10.9pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT" style="font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
Symbol"&gt;&amp;middot;&lt;span style="font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Tramite l&amp;rsquo;ausilio dell&amp;rsquo;&lt;i&gt;E&lt;/i&gt;&lt;/span&gt;&lt;i&gt;xpando Bridge&lt;/i&gt;&lt;span lang="IT"&gt; memorizzo i dati ricevuti dal CRM nei rispettivi attributi estesi definiti in precedenza (vedi &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229587913 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 3&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003500380037003900310033000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align: justify; margin-left: 40px;"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border: none;"&gt;     &lt;tbody&gt;         &lt;tr&gt;             &lt;td width="426" valign="top" style="width:425.8pt;border:solid windowtext 1.0pt;
            mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;package&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt; it.dontesta.liferay.portal.events;&lt;/span&gt;&lt;span style="font-size:8.0pt;
            font-family:Monaco;mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;
            mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F5FBF;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F5FBF;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;/**&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:
            Monaco;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F5FBF;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;* &lt;/span&gt;&lt;span style="font-size:
            8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;
            mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F5FBF;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;*/&lt;/span&gt;&lt;span style="font-size:
            8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;
            mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:
            Monaco;color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt; LoginPostAction   &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:
            Monaco;color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt; Action {&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;/*&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (non-Javadoc)&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;/span&gt;&lt;span style="font-size:8.0pt;
            font-family:Monaco;mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;
            mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @see   com.liferay.portal.kernel.events.Action#run(javax.servlet.http.&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* HttpServletRequest,   javax.servlet.http.HttpServletResponse)&lt;/span&gt;&lt;span style="font-size:8.0pt;
            font-family:Monaco;mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;
            mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;color:#3F7F5F;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;span style="font-size:8.0pt;
            font-family:Monaco;mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;
            mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            color:#646464;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;@Override&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt;   run(HttpServletRequest request, HttpServletResponse response)&lt;/span&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;mso-bidi-font-family:Monaco;
            color:#7F0055;mso-ansi-language:EN-US;mso-fareast-language:JA"&gt;throws&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 8pt; font-family: Monaco;"&gt; ActionException   {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal"&gt;&lt;span style="font-size:8.0pt;font-family:Monaco;
            mso-bidi-font-family:Monaco;mso-ansi-language:EN-US;mso-fareast-language:
            JA"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;             &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
            tab-stops:1.0cm"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;         &lt;/tr&gt;     &lt;/tbody&gt; &lt;/table&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;Listato &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Listato \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;2&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT
style='mso-no-proof:yes'&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Classe che implementa l&amp;rsquo;azione da eseguire sull&amp;rsquo;evento login post action.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;I dati così ottenuti e memorizzati sui campi personalizzati saranno utilizzati in seguito per accedere alle schede di dettaglio del CRM (Contatto e Azienda). In &lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
lang=IT&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;REF _Ref229761839 \h &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Figura 6&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:data&gt;08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F005200650066003200320039003700360031003800330039000000&lt;/w:data&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; un piccolo assaggio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" align="center" style="text-align:center"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape
 id="Picture_x0020_8" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:333pt;
 height:251pt;visibility:visible;mso-wrap-style:square'&gt;
 &lt;v:imagedata src="file://localhost/Users/amusarra/Library/Caches/TemporaryItems/msoclip/0/clip_image011.png"
  o:title="" /&gt;
&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img width="583" height="446" src="http://blog.d-vel.com/image/image_gallery?uuid=ba556299-086d-4756-b7e7-139a0f4b8b22&amp;amp;groupId=12536&amp;amp;t=1368474479076" v:shapes="Picture_x0020_8" alt="Scheda di dettaglio Azienda aperta da Liferay" /&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;a name="_Ref229761839"&gt;&lt;span lang="IT"&gt;Figura &lt;/span&gt;&lt;/a&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229761839'&gt;&lt;/span&gt;&lt;span style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
style='mso-bookmark:_Ref229761839'&gt;&lt;span lang=IT&gt;&lt;span
style="mso-spacerun:yes"&gt; &lt;/span&gt;SEQ Figura \* ARABIC &lt;span style='mso-element:
field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;6&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span
style='mso-bookmark:_Ref229761839'&gt;&lt;/span&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt; Scheda di dettaglio Azienda aperta da Liferay.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoCaption"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1 style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l4 level1 lfo1"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="IT"&gt;6.&lt;span style="font-weight: normal; font-size: 7pt; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="IT"&gt;Conclusioni&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Questo primo episodio è stato molto stringato sulla parte introduttiva degli &lt;i&gt;hooks&lt;/i&gt; cercando comunque di sintetizzare al meglio gli aspetti più importanti per poi focalizzare l&amp;rsquo;attenzione su un caso di studio abbastanza vicino al reale. In questa prima parte, con l&amp;rsquo;aiuto del caso di studio, è stata affrontata la personalizzazione di Liferay tramite &lt;i&gt;hooks&lt;/i&gt;, concentrandosi su, &lt;i&gt;Portal properties&lt;/i&gt; e &lt;i&gt;Performing custom action&lt;/i&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;Nei prossimi episodi vedremo i rimanenti aspetti (&lt;i&gt;Web Resources&lt;/i&gt; e &lt;i&gt;Servlet filter hook&lt;/i&gt;) ultimando il caso di studio. A conclusione di tutti gli episodi ci sarà anche il regalo finale, il repository contenente i sorgenti del progetto oggetto di studio.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;w:sdt sdtdocpart="t" docparttype="Bibliographies" docpartunique="t" id="1127586497"&gt;  &lt;/w:sdt&gt;&lt;/p&gt; &lt;h1&gt;&amp;nbsp;&lt;/h1&gt; &lt;h1&gt;&lt;span lang="IT"&gt;Bibliografia&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span lang="IT" style="font-size:12.0pt;mso-ascii-font-family:Cambria;mso-ascii-theme-font:
minor-latin;mso-fareast-font-family:&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:
&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;color:windowtext;mso-fareast-language:
EN-US;font-weight:normal"&gt;&lt;w:sdtpr&gt;&lt;/w:sdtpr&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p&gt;&lt;w:sdt bibliography="t" id="111145805"&gt; &lt;/w:sdt&gt;&lt;/p&gt;&lt;p class="MsoBibliography"&gt;&lt;!--[if supportFields]&gt;&lt;span lang=IT&gt;&lt;span
  style='mso-element:field-begin'&gt;&lt;/span&gt;&lt;span
  style="mso-spacerun:yes"&gt; &lt;/span&gt;BIBLIOGRAPHY &lt;span style='mso-element:field-separator'&gt;&lt;/span&gt;&lt;/span&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;Koivisto,   M. (2012, Mar 3). &lt;i&gt;Developing Liferay Plugins with Maven.&lt;/i&gt; Tratto da   SlideShare:   &lt;a href="http://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven"&gt;http://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span lang="IT"&gt;&lt;w:sdtpr&gt;&lt;/w:sdtpr&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;Koivisto, M. (2012, Feb 1). &lt;i&gt;Getting started with Liferay   Maven SDK.&lt;/i&gt; Tratto da Liferay Blog:   &lt;a href="http://www.liferay.com/it/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-maven-sdk"&gt;http://www.liferay.com/it/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-maven-sdk&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;Liferay Inc. (2012). &lt;i&gt;Creating a Hook.&lt;/i&gt; Tratto da   Liferay Portal 6.1 - Development Guide:   &lt;a href="http://www.liferay.com/it/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-maven-sdk"&gt;http://www.liferay.com/it/documentation/liferay-portal/6.1/development/-/ai/creating-a-ho-4&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;Liferay Inc. (2012). &lt;i&gt;Ext plugins.&lt;/i&gt; Tratto da Liferay   Portal 6.1 - Development Guide:   &lt;a href="http://www.liferay.com/it/documentation/liferay-portal/6.1/development/-/ai/ext-plugi-4"&gt;http://www.liferay.com/it/documentation/liferay-portal/6.1/development/-/ai/ext-plugi-4&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;Liferay Inc. (2012). &lt;i&gt;Hooks.&lt;/i&gt; Tratto da Liferay Portal   6.1 - Development Guide: &lt;a href="http://www.liferay.com/it/documentation/liferay-portal/6.1/development/-/ai/hoo-4"&gt;http://www.liferay.com/it/documentation/liferay-portal/6.1/development/-/ai/hoo-4&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoBibliography"&gt;&lt;span lang="IT"&gt;Musarra, A. (2012, Oct 18). &lt;i&gt;Creare progetti Liferay   tramite il plugin m2eclipse (Maven for Eclipse).&lt;/i&gt; Tratto da Antonio   Musarra's Blog:   http://musarra.wordpress.com/2012/10/18/creare-progetti-liferay-tramite-il-plugin-m2eclipse-maven-for-eclipse/&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;!--[if supportFields]&gt;&lt;b&gt;&lt;span lang=IT style='mso-no-proof:
  yes'&gt;&lt;span style='mso-element:field-end'&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;![endif]--&gt;&lt;span lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph;
text-indent:1.0cm"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;div&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;br clear="all" /&gt; &lt;hr align="left" size="1" width="33%" /&gt; &lt;!--[endif]--&gt; &lt;div id="ftn1"&gt;&lt;p class="MsoFootnoteText"&gt;&lt;a href="#_ftnref1" name="_ftn1" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:8.0pt;mso-bidi-font-size:
12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="IT"&gt; Il processo d&amp;rsquo;installazione o aggiornamento di componenti a un server in esecuzione senza arrestare e riavviare il server stesso.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;div id="ftn2"&gt;&lt;p class="MsoFootnoteText"&gt;&lt;a href="#_ftnref2" name="_ftn2" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:8.0pt;mso-bidi-font-size:
12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="IT"&gt; E&amp;rsquo; un ambiente di sviluppo che aiuta nello sviluppo di tutti i tipi di plugin di Liferay basato sul Apache Ant, di recente è stata introdotta anche la possibilità di realizzare plugin tramite Apache Maven.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;div id="ftn3"&gt;&lt;p class="MsoFootnoteText"&gt;&lt;a href="#_ftnref3" name="_ftn3" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:8.0pt;mso-bidi-font-size:
12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[3]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="IT"&gt; &lt;/span&gt;Per&amp;nbsp;&lt;b&gt;mockup&lt;/b&gt;&amp;nbsp;si intende comunemente la riproduzione di un oggetto originale ad uso didattico, dimostrativo, scenografico o di comunicazione visiva&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoFootnoteText"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;div id="ftn4"&gt;&lt;p class="MsoFootnoteText"&gt;&lt;a href="#_ftnref4" name="_ftn4" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:8.0pt;mso-bidi-font-size:
12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[4]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="IT"&gt; L'&lt;b&gt;identificativo univoco universale&lt;/b&gt;&amp;nbsp;(&lt;b&gt;universally unique identifier&lt;/b&gt;&amp;nbsp;o&amp;nbsp;&lt;b&gt;UUID&lt;/b&gt;) è un identificativo standard usato nelle infrastrutture software, standardizzato dalla&amp;nbsp;&lt;i&gt;Open Software Foundation&lt;/i&gt;&amp;nbsp;(OSF) come parte di un ambiente distribuito di computazione.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p class="MsoFootnoteText"&gt;&lt;span lang="IT"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;div id="ftn5"&gt;&lt;p class="MsoFootnoteText"&gt;&lt;a href="#_ftnref5" name="_ftn5" title=""&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT"&gt;&lt;!--[if !supportFootnotes]--&gt;&lt;span class="MsoFootnoteReference"&gt;&lt;span lang="IT" style="font-size:8.0pt;mso-bidi-font-size:
12.0pt;font-family:Cambria;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:
&amp;quot;ＭＳ 明朝&amp;quot;;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;
mso-ansi-language:IT;mso-fareast-language:EN-US;mso-bidi-language:AR-SA"&gt;[5]&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="IT"&gt; E&amp;rsquo; l&amp;rsquo;interfaccia d&amp;rsquo;accesso ai custom fields di un determinato model.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt; &lt;!--EndFragment--&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Mon, 13 May 2013 19:24:38 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/introduzione-agli-hooks:-primo-episodio</guid>
      <dc:creator>Antonio Musarra</dc:creator>
      <dc:date>2013-05-13T19:24:38Z</dc:date>
    </item>
    <item>
      <title>Query in esecuzione in Postgresql</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/query-in-esecuzione-in-postgresql</link>
      <description>&lt;p&gt;Al fine di poter migliorare le performance del vostro database Postgresql può essere utile conoscere quali query sono in esecuzione in un dato istante.&lt;/p&gt;&lt;p&gt;Senza andare ad abilitare il logging delle query lente (configurazione che è cambiata anche da versione a versione) si può semplicemente interrogare la tabella&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; background-color: rgb(222, 231, 236); font-size: 12px;"&gt;pg_stat_activity.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;postgres=# SELECT datname,procpid,current_query FROM pg_stat_activity;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&amp;nbsp;datname &amp;nbsp; &amp;nbsp;| procpid | current_query&amp;nbsp;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;---------------+---------+---------------&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&amp;nbsp;dbtest1 &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp;3453 | &amp;lt;IDLE&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&amp;nbsp;dbtest2 &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; 25675 | SELECT * FROM test where id=100; &amp;nbsp;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;&amp;nbsp;dbtest1 &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; 34533 | &amp;lt;IDLE&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;em&gt;(3 rows)&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;La tabella contiene altre informazioni utili come l'orario di start della query, l'ip del client da cui è stata eseguita e il nome dell'utente.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In questo modo è possibile anche avere la lista delle query che sono in esecuzione ad esempio da più di 3 secondi:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-size: small;"&gt;select now()-query_start tempo from pg_stat_activity where now()-query_start &amp;nbsp;&amp;gt; '3 seconds' and current_query &amp;lt;&amp;gt; '&amp;lt;IDLE&amp;gt;';&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 29 Apr 2013 13:15:47 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/query-in-esecuzione-in-postgresql</guid>
      <dc:creator>Simone Celli Marchi</dc:creator>
      <dc:date>2013-04-29T13:15:47Z</dc:date>
    </item>
    <item>
      <title>IPC client-side in Liferay.</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/ipc-client-side-in-liferay</link>
      <description>&lt;p&gt;Ciao a tutti.&lt;/p&gt;&lt;p&gt;La specifica JSR 286 ha indrodotto 2 modalità per lo scambio di informazioni tra portlet, noto come Inter-Portlet-Communication: uno basato sullo scambio di parametri (shared render parameters) e un modello ad eventi.&lt;/p&gt;&lt;p&gt;Il modello ad eventi è quello più interessante.&lt;/p&gt;&lt;p&gt;In breve, una portlet viene configurata per inviare un evento e una o più portlet vengono configurate per ricevere e consumare l'evento; la configurazione viene fatta nel file portlet.xml e un evento è un qualunque oggetto che sia serializable.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Supponiamo di avere una portlet che visualizza categorie ad albero nel modo classico: cliccando su una categoria appare il &amp;lt;div&amp;gt; che contiene le sotto categorie (stile portlet &amp;quot;Categories Navigation&amp;quot;) e supponiamo di avere&amp;nbsp;&lt;span style="font-size: 14px;"&gt;una portlet che visualizza prodotti, filtrando la lettura dalla base dati tramite la categoria cliccata sull'altra (stile asset publisher).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Nel file portlet.xml,&amp;nbsp;portlet che pubblica l&amp;rsquo;evento&lt;/p&gt;    &lt;pre&gt;
&amp;lt;supported-publishing-event&amp;gt;
&amp;lt;name&amp;gt;&lt;strong style="font-size: 14px;"&gt; catSelected &lt;/strong&gt;&lt;span style="font-size: 14px;"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/supported-publishing-event&amp;gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;pe la portlet che processa l&amp;rsquo;evento&lt;/p&gt;   &lt;pre&gt;
&amp;lt;supported-processing-event&amp;gt;
&amp;lt;name&amp;gt;&lt;strong style="font-size: 14px;"&gt; catSelected &lt;/strong&gt;&lt;span style="font-size: 14px;"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/supported-processing-event&amp;gt;&lt;/pre&gt;&lt;p class="p2"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ogni portlet che riceve l'evento, implementa il metodo&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;p class="p1"&gt;@ProcessingEvent(name = &amp;ldquo;catSelected&amp;rdquo;)&lt;/p&gt;&lt;p class="p1"&gt;public void processoCatSelected(EventRequest request, EventResponse response)&lt;/p&gt;&lt;p class="p1"&gt;throws IOException, PortletException {&lt;/p&gt;&lt;p class="p1"&gt;Event event = request.getEvent();&lt;/p&gt;&lt;p class="p1"&gt;&lt;span style="font-size: 14px;"&gt;   String catId = (String) event.getValue();&lt;/span&gt;&lt;/p&gt;&lt;p class="p1"&gt;List &amp;lt;Prodotti&amp;gt; prodotti =&amp;nbsp;readProdottiFromDb(catId);&lt;/p&gt;&lt;p class="p1"&gt;request.getPortletSession().setAttribute(&amp;ldquo;prodotti&amp;rdquo;, prodotti);&lt;/p&gt;&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;&lt;/pre&gt;&lt;pre&gt;&lt;p class="p1" style=""&gt;}&lt;/p&gt;
&lt;/pre&gt;         &lt;p class="p1"&gt;L'evento viene consumato nel metodo e quindi è possibile, ad esempio, memorizzarlo nella portletSession &amp;nbsp;per utilizzarlo successivamente in una pagina jsp. L'annotation serve per discriminare tra i metodi processAction che processano eventi differenti.&lt;/p&gt;&lt;p class="p1"&gt;La portlet che invia l'evento, lo fa con l'istruzione seguente, posta in un metodo processAction&lt;/p&gt;&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;
response.setEvent(&amp;ldquo;catSelected&amp;rdquo;, &amp;quot;123&amp;quot;);&lt;/pre&gt;&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;        &lt;p&gt;Viene quindi scambiato l'evento &amp;quot;selezionata categoria 123&amp;quot;&lt;/p&gt;&lt;p&gt;Tramite il &amp;quot;giro di giostra&amp;quot; descritto l'evento viene scambiato tra le portlet a livello server e questo implica che la pagina debba essere ricaricata interamente e che quindi dobbiamo memorizzare in qualche modo lo stato di visualizzazione delle portlet per poter ripresentare all'utente la schermata esattamente come l'ha lasciata: nel nostro caso devo ricordare quale è la categoria cliccata per poter mostrare l'albero delle categorie in modo corretto. Per portlet molto complesse questo può essere fastidioso.&lt;/p&gt;&lt;p&gt;Se solo si potesse utilizzare ajax...&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14px;"&gt;Effettivamente possiamo fare la stessa cosa utilizzando una funzionalita di IPC messa a disposizione da LR 6.x nota come &lt;/span&gt;&lt;em style="font-size: 14px;"&gt;IPC client-side&lt;/em&gt;&lt;span style="font-size: 14px;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Si tratta delle funzioni javascript&amp;nbsp;&lt;em&gt;Liferay.fire&lt;/em&gt; e &lt;em&gt;Liferay.on&lt;/em&gt;, utilizzate rispettivamente per inviare e ricevere un evento in due portlet instanziate nella stessa pagina.&lt;/p&gt;&lt;p&gt;In Liferay 5.x si chiamavano &lt;em&gt;Liferay.trigger&lt;/em&gt; e &lt;em&gt;Liferay.bind&lt;/em&gt;; sono identiche alle rispettive attuali ma hanno cambiato nome per motivi a me oscuri.&lt;/p&gt;&lt;p&gt;La cosa interessante è che il tutto viene fatto a livello javascript senza dover configurare nulla nei files xml delle mie portlet e tutto il giro viene generato e consumato sulla pagina tra qualunque portlet.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Per inviare un evento:&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;
jQuery(&lt;span class="s1"&gt;function&lt;/span&gt; () {
    jQuery(&lt;span class="s2"&gt;'a.categoria_item'&lt;/span&gt;).click(
       &lt;span class="s1"&gt;function&lt;/span&gt;(event) {
&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;          &lt;span class="s1"&gt;var&lt;/span&gt; catId = jQuery(&lt;span class="s1"&gt;this&lt;/span&gt;).next().val();
&lt;strong&gt;&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;   &lt;span style="font-size: 14px;"&gt;       &lt;/span&gt;&lt;span style="font-size: 14px;"&gt;Liferay.fire(&lt;/span&gt;&lt;span class="s2" style="font-size: 14px;"&gt;'catSelected'&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;, {categoryId: catId});&lt;/span&gt; &lt;/strong&gt;&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;          &lt;span class="s1"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;false&lt;/span&gt;;
&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;        }
&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;      &lt;span class="s4"&gt;)&lt;/span&gt;
&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;    }
&lt;span class="Apple-tab-span"&gt; &lt;/span&gt; );&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s4"&gt;href&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;#&amp;quot;&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s4"&gt;class&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;categoria_item&amp;quot;&lt;span class="s1"&gt;&amp;gt;mia categoria&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt; &lt;span class="s4"&gt;type&lt;/span&gt;=&lt;span class="s6"&gt;&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span class="s4"&gt;name&lt;/span&gt;=&lt;span class="s6"&gt;&amp;quot;catId&lt;/span&gt;&lt;span class="s6"&gt;&amp;quot;&lt;/span&gt; &lt;span class="s4"&gt;value&lt;/span&gt;=&lt;span class="s6"&gt;&amp;quot;123&lt;/span&gt;&lt;span class="s6"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;In questo esempio al click sul link viene inviato un evento &amp;quot;catSelected&amp;quot; che consiste in un JSON, perfetto in questo caso.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Nella portlet che processa l'evento:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;script&lt;/span&gt;&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s4"&gt;type&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;text/javascript&amp;quot;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;
&lt;strong&gt;Liferay.on&lt;/strong&gt;(
&lt;span class="s3"&gt;   &lt;/span&gt;'catSelected'&lt;span class="s3"&gt;,&lt;/span&gt;
   &lt;span class="s5"&gt;function&lt;/span&gt;(event) {
&lt;span class="Apple-tab-span"&gt; &lt;/span&gt; &lt;span class="s5"&gt;var&lt;/span&gt; catId = event.categoryId;
&lt;span class="s3"&gt;&lt;span class="Apple-tab-span"&gt; &lt;/span&gt; jQuery(&lt;/span&gt;'#prodottiWrapper'&lt;span class="s3"&gt;).html(&lt;/span&gt;''&lt;span class="s3"&gt;);&lt;/span&gt;
     jQuery.ajax({
         type: &lt;span class="s6"&gt;'POST'&lt;/span&gt;,
         url: '&lt;span class="s7"&gt;&amp;lt;%=&lt;/span&gt;setCatAction&lt;span class="s7"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="s6"&gt;',&lt;/span&gt;
         data:&lt;span class="s6"&gt;&amp;quot;catId=&amp;quot;&lt;/span&gt;+catId,
         success: &lt;span class="s5"&gt;function&lt;/span&gt;(data){
             jQuery(&lt;span class="s6"&gt;'#prodottiWrapper'&lt;/span&gt;).html(data);
         }
       });
&lt;span class="s3"&gt;    &lt;/span&gt;return&lt;span class="s3"&gt; &lt;/span&gt;false&lt;span class="s3"&gt;;&lt;/span&gt;
   }
 );
&lt;span class="s1"&gt;&amp;lt;/&lt;/span&gt;script&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p class="p5"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p5"&gt;In sostanza l'elaborazione dell'evento consiste nella chiamata ajax ad un action della mia portlet che legge dalla base dati i prodotti che appartengono alla categoria selezionata, mostrati nel &amp;lt;div id=&amp;quot;prodottiWrapper&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;.&lt;/p&gt;&lt;p class="p5"&gt;Il risultato è che la user experience è molto più fluida, tutte le portlet che stanno intorno ignorano tutto questo dialogo e continuano a vivere felicemente nell'ignoranza, genero meno traffico di rete e infine non mi pongo il problema di memorizzare quale categoria è stata cliccata perchè il mio albero di categorie non viene ricaricato.&lt;/p&gt;&lt;p class="p5"&gt;Hope it helps!&lt;/p&gt;&lt;p class="p5"&gt;Marcello&lt;/p&gt;</description>
      <pubDate>Thu, 25 Apr 2013 15:17:50 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/ipc-client-side-in-liferay</guid>
      <dc:creator>marcello marangio</dc:creator>
      <dc:date>2013-04-25T15:17:50Z</dc:date>
    </item>
    <item>
      <title>Passare parametri tra due portlet</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/passare-parametri-tra-due-portlet</link>
      <description>&lt;p&gt;Ciao a tutti.&lt;/p&gt;&lt;p&gt;Vorrei condividere al volo questa cosa in cui mi sono&amp;nbsp;&lt;span style="font-size: 14px;"&gt;imbattuto poco fa.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Solitamente passiamo parametri a pagine diverse della stessa portlet utilizzando una renderURL e invochiamo una action di una portlet tramite la actionURL.&lt;/p&gt;&lt;p&gt;Ma se volessimo passare parametri da una portlet ad una pagina di un'altra? o se volessimo invocare una action di una portlet da un'altra portlet?&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14px;"&gt;Lo scenario è il seguente.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Da una pagina con una portlet X&amp;nbsp;voglio richiamare e visualizzare un'altra portlet Y che sta su un'altra pagina &amp;quot;abc&amp;quot;.&lt;/p&gt;&lt;p&gt;per fare questo si usa la taglib liferay-portlet.&lt;/p&gt;&lt;p&gt;Nella jsp di partenza di X:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;   &lt;pre&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;liferay-portlet:renderURL&lt;/span&gt;&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s4"&gt;plid&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="s5"&gt;&amp;lt;%=destPage&lt;/span&gt;&lt;span class="s3"&gt;Plid &lt;/span&gt;&lt;span class="s5"&gt;%&amp;gt;&lt;/span&gt;&amp;quot;&lt;span class="s3"&gt;  &lt;/span&gt;&lt;span class="s4"&gt;portletName&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;&amp;lt;%=destPortletId%&amp;gt;&amp;quot;&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s4"&gt;var&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;myVar&amp;quot;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;liferay-portlet:param&lt;/span&gt; &lt;span class="s4"&gt;name&lt;/span&gt;=&lt;span class="s6"&gt;&amp;quot;myParam&amp;quot;&lt;/span&gt; &lt;span class="s4"&gt;value&lt;/span&gt;=&lt;span class="s6"&gt;&amp;quot;12345&lt;/span&gt;&lt;span class="s6"&gt;&amp;quot;&lt;/span&gt; &lt;span class="s1"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="s1"&gt;&amp;lt;/&lt;/span&gt;liferay-portlet:renderURL&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt; &lt;span class="s4"&gt;href&lt;/span&gt;=&lt;span class="s6"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s5"&gt;&amp;lt;%=&lt;/span&gt;myVar&lt;span class="s5"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="s6"&gt;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;clicca&lt;span class="s1"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="s1"&gt; &lt;/span&gt; dove destPagePlid è la chiave primaria della pagina di destinazione, che si riesce a ritrovare con una routine di questo tipo:&lt;/p&gt;&lt;p class="p2"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p2"&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span class="s1"&gt;long&lt;/span&gt; pagePlid =0;

List &amp;lt;Layout&amp;gt; pagine = LayoutLocalServiceUtil.getLayouts(themeDisplay.getScopeGroupId(), &lt;span class="s1"&gt;false&lt;/span&gt; );

&lt;span class="s1"&gt;for&lt;/span&gt;(Layout pagina : pagine){

&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;String pagename =pagina.getName(themeDisplay.getLocale()); 

&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;span class="s1"&gt;if&lt;/span&gt;(pagename.equals(&lt;span class="s2"&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;)){

&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;pagePlid=pagina.getPlid();

break;

&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;}

}&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p2"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p2"&gt;mentre&amp;nbsp;&lt;span style="font-size: 14px;"&gt;destPortletId è il portletid della portlet di destinazione, nel classico formato nomeportlet_WAR_nomewebapp&lt;/span&gt;&lt;/p&gt;&lt;p class="p2"&gt;in questo modo cliccando sul link &amp;quot;clicca&amp;quot; della pagina della portlet X invoco la URL della pagina &amp;quot;abc&amp;quot;, passando anche un parametro alla portlet Y instanziata in quella pagina.&lt;/p&gt;&lt;p class="p2"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p2"&gt;In modo del tutto analogo, si può richiamare una action se invece dell'renderURL usiamo la actionURL.&lt;/p&gt;&lt;p class="p2"&gt;Spero possa essere utile.&lt;/p&gt;&lt;p class="p2"&gt;Ciao a tutti&lt;/p&gt;&lt;p class="p2"&gt;Marcello&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Wed, 17 Apr 2013 22:05:00 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/passare-parametri-tra-due-portlet</guid>
      <dc:creator>marcello marangio</dc:creator>
      <dc:date>2013-04-17T22:05:00Z</dc:date>
    </item>
    <item>
      <title>Introduzione a Liferay Message Bus</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/introduzione-a-liferay-message-bus</link>
      <description>&lt;p&gt;Era da tanto che volevo scrivere un post sul Message Bus ma il tempo per farlo &amp;quot;bene&amp;quot; non&amp;nbsp;&lt;/p&gt;&lt;p&gt;lo riuscivo mai a trovare!&lt;/p&gt;&lt;p&gt;Poi un giorno &lt;a href="http://musarra.wordpress.com/about/" target="_blank" title="Antonio Musarra"&gt;Antonio Musarra&lt;/a&gt; ne ha scritto uno perfetto, e allora mi sono detto: &amp;quot;Beh, non ho più bisogno di scriverlo io, posso linkare direttamente il suo! :D&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Allora, a beneficio di tutti, ecco l'ottimo post di Antonio riguardante l'&lt;a href="http://musarra.wordpress.com/2013/03/29/introduzione-a-liferay-message-bus/" target="_blank" title="Introduzione a Liferay Message Bus - Antonio Musarra"&gt;introduzione a Liferay Message Bus&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ne approfitto anche per segnalare che Antonio scriverà per noi qualche guest post nei prossimi giorni. Così &lt;a href="http://blog.d-vel.com/web/blog/home/-/blogs/il-form-navigator-di-liferay" title="Il Form navigator di Liferay - Marcello Marangio"&gt;come ha già fatto Marcello Marangio&lt;/a&gt;, altre grandissimo dello sviluppo su Liferay e di Java in generale! :)&lt;/p&gt;&lt;p&gt;Oltre ad esserne fieri, ringraziamo pubblicamente entrambi per la &amp;quot;fattiva&amp;quot; collaborazione!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;È bello che ci siano ancora persone a cui piace condividere la conoscenza, come tutti noi, del resto, che scriviamo e commentiamo questo blog! ;D&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A presto! :)&lt;/p&gt;</description>
      <pubDate>Fri, 12 Apr 2013 06:25:58 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/introduzione-a-liferay-message-bus</guid>
      <dc:creator>Jader Jed Francia</dc:creator>
      <dc:date>2013-04-12T06:25:58Z</dc:date>
    </item>
    <item>
      <title>Liferay ed utilizzo "multiplo" di categorie</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/liferay-ed-utilizzo-multiplo-di-categorie</link>
      <description>&lt;p&gt;Lavorare con le proprie entità custom integrate alle categorie di Liferay è, tutto sommato, abbastanza semplice ed indolore. Tuttavia mi sono trovato recentemente a dover affrontare un problema spinoso ma, fortunamente, abbastanza inconsueto.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La situazione è la seguente:&lt;/p&gt; &lt;ul&gt;     &lt;li&gt;ho definito 2 mie entità custom, che chiameremo &lt;code&gt;EntitaA&lt;/code&gt; ed &lt;code&gt;EntitaB&lt;/code&gt;;&lt;/li&gt;     &lt;li&gt;ho definito i relativi &lt;code&gt;AssetRender &lt;/code&gt;in modo da potermi integrare con le categorie;&lt;/li&gt;     &lt;li&gt;ho creato un vocabolario ed associato ad &lt;em&gt;entrambe &lt;/em&gt;le entità custom.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;All'interno della pagina JSP (per esigenze che non sto ad approfondire) ho dovuto inserire 2 distinti form HTML, uno per &lt;code&gt;EntitaA&lt;/code&gt; e l'altro &lt;code&gt;EntitaB&lt;/code&gt;; in entrambi ho utilizzato la taglib di Alloy per la gestione delle categorie, ossia:&lt;/p&gt; &lt;pre&gt;
&amp;lt;aui:input name=&amp;quot;categories&amp;quot; type=&amp;quot;assetCategories&amp;quot; /&amp;gt;
&lt;/pre&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Il problema è insito nel funzionamento interno di tale taglib, che si appoggia infatti sull'altra taglib di Liferay: &lt;code&gt;&amp;lt;liferay-ui:asset-categories-selector /&amp;gt;&lt;/code&gt;. Questa taglib infatti crea un campo di testo nascosto &lt;em&gt;per ogni vocabolario&lt;/em&gt; e gli assegna, &lt;em&gt;sia come name che come id&lt;/em&gt;, la stringa: &lt;code&gt;assetCategoryIds_&amp;lt;vocabularyId&amp;gt;&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;La valorizzazione del campo nascosto è demandata al codice di Alloy della taglib; il problema è proprio qui perchè i form HTML sono sì separati ma il mio vocabolario è associato ad entrambe le entità custom e quindi nella pagina ci sono 2 elementi nascosti con lo stesso nome e con lo stesso id.&lt;/p&gt; &lt;p&gt;Di conseguenza quando si seleziona una categoria per la seconda entità custom &lt;code&gt;EntitaB&lt;/code&gt;, Alloy valorizza il campo nascosto della prima; questo succede perchè in presenza di più campi con lo stesso id, Alloy prende il primo. Quindi al submit del secondo form, il campo nascosto è vuoto e la categoria non viene di conseguenza salvata.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Dopo un pò di scouting sui sorgenti di Liferay, la soluzione è stata abbastanza semplice da mettere in piedi: differenziare gli id. Ok, ma come?&lt;/p&gt; &lt;p&gt;Nel secondo form, e solo lì, ho sostituito la taglib di Alloy con quella di Liferay andando a specificare esplicitamente tutti gli attributi necessari:&lt;/p&gt; &lt;pre&gt;
&amp;lt;liferay-ui:asset-categories-selector
    className=&amp;quot;&amp;lt;%=EntitaB.class.getName() %&amp;gt;&amp;quot;
    classPK=&amp;quot;&amp;lt;%=entitaB.getPrimaryKey() %&amp;gt;&amp;quot;
    contentCallback='&amp;lt;%= renderResponse.getNamespace() + &amp;quot;getSuggestionsContent&amp;quot; %&amp;gt;'
    hiddenInput=&amp;quot;assetCategoryIdsEntitaB&amp;quot; /&amp;gt;
&lt;/pre&gt; &lt;p&gt;Il punto focale è l'attributo &lt;code&gt;hiddenInput &lt;/code&gt;che mi permette di specificare il nome che dovrà avere il campo nascosto; ma attenzione perchè, affinchè tutto funzioni, è necessario che il valore dell'attributo &lt;code&gt;hiddenInput &lt;/code&gt;inizi con &lt;code&gt;assetCategoryIds&lt;/code&gt;; infatti solo in questo modo il &lt;code&gt;ServiceContext &lt;/code&gt;è in grado di recuperare correttamente i dati dalla request.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;</description>
      <pubDate>Fri, 15 Mar 2013 11:41:04 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/liferay-ed-utilizzo-multiplo-di-categorie</guid>
      <dc:creator>Marco Napolitano</dc:creator>
      <dc:date>2013-03-15T11:41:04Z</dc:date>
    </item>
    <item>
      <title>Il form navigator di Liferay</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/il-form-navigator-di-liferay</link>
      <description>&lt;p&gt;Spesso mi capita di sviluppare funzionalità in Liferay, specialmente riguardanti l'interfaccia utente, di perdere tantissimo tempo nel perfezionare una routine javascript che faccia sparire un DIV, che ne evidenzi un'altro o che ne posizioni un'altro ancora.&lt;/p&gt; &lt;p&gt;Poi, dopo giorni di lavoro, mi accorgo che c'e' un oggetto in Liferay che fa esattamente quello che voglio, con 2 righe di codice.&lt;/p&gt; &lt;p&gt;E' questo il caso della taglib liferay-ui:form-navigator: è quel box azzurro che si trova alla destra di molte form del pannello di controllo, come ad esempio la gestione utente o la gestione di un site.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog.d-vel.com/image/image_gallery?uuid=82d717ca-2a8e-4dca-be9b-e3fc438d2a46&amp;amp;groupId=12536&amp;amp;t=1363205658268" width="443" height="636" alt="" /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Ovviamente l'aspetto grafico è governato dai CSS per cui è utilizzabile anche al di fuori del control panel e personalizzabile come tutto in Liferay.&lt;/p&gt; &lt;p&gt;Per utilizzare il form navigator occorre importare le seguenti taglib:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;pre style="font-size: 14px;"&gt;&lt;p&gt;&amp;lt;%@ taglib uri=&amp;quot;http://alloy.liferay.com/tld/aui&amp;quot; prefix=&amp;quot;aui&amp;quot; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;%@ taglib uri=&amp;quot;http://liferay.com/tld/ui&amp;quot; prefix=&amp;quot;liferay-ui&amp;quot; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;%@ taglib uri=&amp;quot;http://liferay.com/tld/util&amp;quot; prefix=&amp;quot;liferay-util&amp;quot; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/pre&gt; &lt;p&gt;Il form navigator si usa così nella home.jsp (o comunque si chiami):&lt;/p&gt; &lt;p&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;&amp;lt;portlet:actionURL name=&amp;quot;saveAll&amp;quot; var=&amp;quot;saveAll&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;&amp;lt;aui:form action=&amp;quot;&amp;lt;%=saveAll%&amp;gt;&amp;quot; name=&amp;quot;form&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;&amp;lt;liferay-ui:form-navigator&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-size: 14px; "&gt;
    backURL=&amp;quot;&amp;lt;%=backURL %&amp;gt;&amp;quot;
    categoryNames=&amp;quot;&amp;lt;%= categoryNames %&amp;gt;&amp;quot;
    categorySections=&amp;quot;&amp;lt;%= categorySections %&amp;gt;&amp;quot;
    formName=&amp;quot;form&amp;quot;
    htmlTop=&amp;quot;&amp;lt;%=htmlTop %&amp;gt;&amp;quot;
    htmlBottom=&amp;quot;&amp;lt;%=htmlBottom %&amp;gt;&amp;quot;
    jspPath=&amp;quot;/sections/&amp;quot; 
    showButtons=&amp;quot;&amp;lt;%=true %&amp;gt;&amp;quot;
/&amp;gt;
&amp;lt;/aui:form&amp;gt;

dove:&lt;/pre&gt; &lt;p&gt;&lt;strong&gt;backUrl&lt;/strong&gt;: (opzionale) è la URL associata al pulsante Cancel&lt;/p&gt; &lt;p&gt;&lt;strong&gt;categoryNames&lt;/strong&gt;: è uno String array con le label delle sezioni (nell'esempio, dopo la localizzazione delle label: User Information, Identification, Miscellaneous)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;categorySections&lt;/strong&gt;: è uno String[ ][ ] che contiene le voci di ogni sezione; all'i-esimo categoryName corrisponde l'i-esimo categorySection[ ]. Nell'esempio, categorySections[0]={&amp;quot;details&amp;quot;,&amp;quot;password&amp;quot;,&amp;quot;organizations&amp;quot;,&amp;quot;sites&amp;quot;,&amp;quot;usergroups&amp;quot;,&amp;quot;roles&amp;quot;,&amp;quot;personal_site&amp;quot;,&amp;quot;categorization&amp;quot;}&lt;/p&gt; &lt;p&gt;&lt;strong&gt;formName&lt;/strong&gt;: (opzionale) il nome della form che racchiude il form-navigator&lt;/p&gt; &lt;p&gt;&lt;strong&gt;htmlTop&lt;/strong&gt;: (opzionale) è il pezzo di codice html che andrà al top del form navigator&lt;/p&gt; &lt;p&gt;&lt;strong&gt;htmlBottom&lt;/strong&gt;: come sopra, ma sotto :-)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;jspPath&lt;/strong&gt;: è il path che contiene i files jsp corrispondenti alle categorySections: nell'esempio, esiste una pagina password.jsp, una pagina organizations.jsp etc; il file si deve chiamare come la stringa contenuta nell'array e non come la sua versione localizzata a schermo.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;showButtons&lt;/strong&gt;:(opzionale) &amp;nbsp;di default a true, serve per visualizzare o nascondere la button bar con Save e Cancel.&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 14px;"&gt;In sostanza la taglib&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;crea un div nascosto per ogni pagina jsp che trova nel jspPath e che corrisponde a una voce di categorySections; poi crea il codice per gestire i click sui link del menù, per evidenziare il link cliccato, visualizzare il div corrispondente e nascondere quello attualmente visualizzato.&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;Il pulsante Save esegue l'action della form che racchiude il form-navigator (nel mio caso&amp;quot;saveAll&amp;quot;); la form conterrà la somma di tutti gli elementi html inseriti in tutte le categorySections.&lt;/p&gt; &lt;p&gt;Le pagine jsp delle varie sections possono essere complicate a piacere, tanto da poter includere altre form con altre actions, o risultati di ricerca con il search-container, anche paginati etc.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Piccolo problema:&lt;/strong&gt; se la pagina jsp contiene una form che fa POST su un'action, al ritorno dall'elaborazione il browser atterrerà sulla pagina principale, visualizzando la prima section (questo perchè devo sempre scrivere actionRequest.&lt;span style="font-size: 14px;"&gt;setRenderParameter&lt;/span&gt;(&amp;quot;jspPage&amp;quot;,&amp;quot;home.jsp&amp;quot;) e non posso impostare una sottopagina nel renderparameter. Di conseguenza se sto editando, ad esempio, i ruoli dell'utente ad ogni &amp;quot;add&amp;quot; LR ritorna sui dettagli. Il trucco c'e', ma non si vede: con un po' di javascript viene reimpostata la pagina corretta subito dopo, per questo tutto sembra filare liscio.&lt;/p&gt; &lt;p&gt;Purtroppo questa cosa non è automatica, cioè non è inclusa nel taglib del form-navigator, per cui occorre industrarsi un pò.&lt;/p&gt; &lt;p&gt;Studiando, come al solito, il funzionamento del codice html con google chrome, ho visto che&amp;nbsp;&lt;span style="font-size: 14px;"&gt;per ogni categorySection il div che contiene la pagina corrispondente ha &amp;nbsp;id&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 14px; font-family: 'Courier New', Courier, monospace; white-space: pre;"&gt;&amp;lt;portlet:namespace/&amp;gt;nomeCategorySection&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Il link che lo fa apparire ha id&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;&amp;lt;portlet:namespace/&amp;gt;nomeCategorySection&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;Link&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;la classe css che fa sparire il div è &amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;aui-helper-hidden-accessible, &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre; font-size: 14px;"&gt;mentre quella che fa apparire un div o visualizzare il link come selezionato è&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt; selected&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;La mia soluzione prevede che ad ogni action delle varie categorySections venga impostato un request attribute che contiene il nome della pagina da visualizzare.&lt;/p&gt;&lt;p&gt;Ad esempio, nel mio caso&amp;nbsp;&lt;span style="font-size: 14px;"&gt;esiste una categorySection &amp;quot;video&amp;quot; e una pagina &amp;quot;video.jsp&amp;quot; che contiene a form che invoca l'action saveVideo, la cui ultima istruzione è&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;
actionRequest.setAttribute(&lt;span class="s1"&gt;&amp;quot;page2show&amp;quot;&lt;/span&gt;,&amp;nbsp;&lt;span class="s1"&gt;&amp;quot;video&amp;quot;&lt;/span&gt;);&lt;/pre&gt; &lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt; &lt;p class="p1"&gt;Alla fine della jsp home.jsp che contiene il form navigator ho inserito queste istruzioni jquery:&lt;/p&gt; &lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;script&lt;/span&gt;&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s4"&gt;type&lt;/span&gt;&lt;span class="s3"&gt;=&lt;/span&gt;&amp;quot;text/javascript&amp;quot;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;
$('#&lt;span class="s5"&gt;&amp;lt;&lt;/span&gt;portlet:namespace/&amp;gt;&lt;span class="s6"&gt;&amp;lt;%=&lt;/span&gt;page2show&lt;span class="s6"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="s7"&gt;').addClass(&amp;quot;selected&amp;quot;);&lt;/span&gt;
&lt;span class="s3"&gt;$('#&lt;/span&gt;&lt;span class="s5"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s3"&gt;portlet:namespace/&amp;gt;&lt;/span&gt;&lt;span class="s8"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="s9"&gt;page2show&lt;/span&gt;&lt;span class="s8"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="s10"&gt;').&lt;/span&gt;removeClass(&amp;quot;aui-helper-hidden-accessible&amp;quot;);
&lt;span class="s3"&gt;$(&lt;/span&gt;'#&amp;lt;portlet:namespace/&amp;gt;primaSection'&lt;span class="s3"&gt;).addClass(&lt;/span&gt;&amp;quot;aui-helper-hidden-accessible&amp;quot;&lt;span class="s3"&gt;);&lt;/span&gt;
&lt;span class="s3"&gt;$(&lt;/span&gt;'#&amp;lt;portlet:namespace/&amp;gt;&lt;span style="font-size: 14px;"&gt;primaSection&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;'&lt;/span&gt;&lt;span class="s3" style="font-size: 14px;"&gt;).removeClass(&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;&amp;quot;selected&amp;quot;&lt;/span&gt;&lt;span class="s3" style="font-size: 14px;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="s3"&gt;$(&lt;/span&gt;'#&amp;lt;portlet:namespace/&amp;gt;&lt;span style="font-size: 14px;"&gt;primaSection&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;Link'&lt;/span&gt;&lt;span class="s3" style="font-size: 14px;"&gt;).parent().removeClass(&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;&amp;quot;selected&amp;quot;&lt;/span&gt;&lt;span class="s3" style="font-size: 14px;"&gt;);&lt;/span&gt;&lt;br /&gt;$('#&lt;span class="s5"&gt;&amp;lt;&lt;/span&gt;portlet:namespace/&amp;gt;&lt;span class="s8"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="s10"&gt;page2show&lt;/span&gt;&lt;span class="s8"&gt;%&amp;gt;&lt;/span&gt;Link&lt;span class="s7"&gt;').parent().addClass(&amp;quot;selected&amp;quot;);&lt;/span&gt;
&lt;span class="s1"&gt;&amp;lt;/&lt;/span&gt;script&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Nel mio caso &amp;quot;primaSection&amp;quot; è la prima categorySection.&lt;/p&gt;&lt;p&gt;Le ultime 2 istruzioni impostano i link. La struttura del menù html che si vede nell'HTML della pagina&amp;nbsp;è simile alla seguente:&lt;/p&gt;&lt;pre&gt;
&amp;lt;ul&amp;gt;
&amp;lt;li class=&amp;quot;selected&amp;quot;&amp;gt;
&amp;lt;a id=&amp;quot;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;&amp;lt;portlet:namespace/&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;primaSection&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre; font-size: 14px;"&gt;Link&amp;quot;&amp;gt;&lt;/span&gt;
&amp;lt;/li&amp;gt;
&lt;pre&gt;
&amp;lt;li class&amp;gt;
&amp;lt;a id=&amp;quot;&lt;span style="font-size: 14px;"&gt;&amp;lt;portlet:namespace/&amp;gt;&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;video&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;Link&amp;quot;&amp;gt;&lt;/span&gt;
&amp;lt;/li&amp;gt;
&lt;/pre&gt;&lt;div&gt;&lt;span style="font-size: 14px;"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;La selezione del menù viene implementata con una classe dell'elemento LI (che non ha id)&amp;nbsp;che racchiude il link; a questo sono dovute le due modifiche alle classi css del parent(). &amp;nbsp;&lt;/p&gt;&lt;p&gt;In sostanza, al ritorno da ogni action nascondo il primo DIV, deseleziono il link corrispondente, visualizzo il DIV deciso nell'action e seleziono il link corrispondente.&lt;/p&gt; &lt;p&gt;Probabilmente esiste una soluzione più liferay-istica, ma questa funziona bene ed è molto semplice.&lt;/p&gt;&lt;p&gt;Spero possa esser d'aiuto.&lt;/p&gt;&lt;p&gt;Buon lavoro!&lt;/p&gt;&lt;p&gt;Marcello&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;liferay-ui:form-navigator backurl="&amp;lt;%=backURL %&amp;gt;" categorynames="&amp;lt;%= categoryNames %&amp;gt;" categorysections="&amp;lt;%= categorySections %&amp;gt;" formname="form" htmltop="&amp;lt;%=htmlTop %&amp;gt;" htmlbottom="&amp;lt;%=htmlBottom %&amp;gt;" jsppath="/sections/" showbuttons="&amp;lt;%=true %&amp;gt;"&gt;&lt;/liferay-ui:form-navigator&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 13 Mar 2013 19:57:59 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/il-form-navigator-di-liferay</guid>
      <dc:creator>marcello marangio</dc:creator>
      <dc:date>2013-03-13T19:57:59Z</dc:date>
    </item>
    <item>
      <title>URL parlanti anche quando linkiamo dal CMS</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/url-parlanti-anche-quando-linkiamo-dal-cms</link>
      <description>&lt;p&gt;Spesso utilizzando le &lt;strong&gt;strutture per i web content di Liferay&lt;/strong&gt; utilizziamo il tipo &amp;quot;Link a pagina&amp;quot;: questo speciale tipo di dato permette al contributore, in fase di data entry, di selezionare da un comodo select box una pagina del sito, senza doverne mettere a mano il nome o altro.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;All'interno del template di rendering del contenuto, poi, stampiamo il valore che il campo contiene &lt;strong&gt;ma il link che viene generato mostra solamente l'id della pagina e non il friendly url&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Lato Liferay, questo è poco male: il sistema, infatti, è in grado autonomamente di riconoscere l'indirizzo e di caricare la pagina relativa all'id, senza &amp;quot;turbare&amp;quot; la &lt;em&gt;user experience&lt;/em&gt; del navigatore.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Peccato che &lt;a href="http://www.cronomedia.com" target="_blank" id="posizionamento-siti-web-search-engine-optimization-SEO-posizionamento-sui-motori-di-ricerca" name="posizionamento siti web, search engine optimization, SEO, posizionamento sui motori di ricerca" title="posizionamento siti web, search engine optimization, SEO, posizionamento sui motori di ricerca"&gt;i nostri amici della SEO&lt;/a&gt; poi vengono da noi e si lamentano che le pagine non hanno il nome parlante!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Quindi? Che fare??&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Beh, un po' di &lt;strong&gt;velocity&lt;/strong&gt; e tutto si sistema!&lt;/p&gt;&lt;p&gt;Ecco qui un bello snippet già pronto all'uso che, dato l'id della pagina letto dal campo contribuito in fase di data entry è in grado di generare il link usando la friendlyUrl:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;#set ($service = &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    $serviceLocator.findService(&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;       &amp;quot;com.liferay.portal.service.LayoutLocalService&amp;quot;))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;#set ($myGroup = $getterUtil.getLong($groupId))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;#set ($myLayoutId = $getterUtil.getLong($Linkpagina.getData()))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;#set ($myLayout = $service.getLayout($myGroup, false, $myLayoutId))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;a href=&amp;quot;&lt;strong&gt;$myLayout.getFriendlyURL()&lt;/strong&gt;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;$titolo.getData()&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Che cosa ne pensate?&lt;br /&gt;Facile, no? :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Un'ultima raccomandazione, però: per poter utilizzare la variabile &lt;code&gt;$serviceLocator&lt;/code&gt; dentro al vostro template velocity dovete prima valorizzare a stringa vuota questa property dentro al vostro &lt;code&gt;portal-ext.properties&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;journal.template.velocity.restricted.variables&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Questo perché, di default, è valorizzata così:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;journal.template.velocity.restricted.variables=serviceLocator&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;quindi la variabile viene inibita all'interno dei vostri template!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Alla prossima! :)&lt;/p&gt;</description>
      <pubDate>Sat, 09 Mar 2013 16:12:32 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/url-parlanti-anche-quando-linkiamo-dal-cms</guid>
      <dc:creator>Jader Jed Francia</dc:creator>
      <dc:date>2013-03-09T16:12:32Z</dc:date>
    </item>
    <item>
      <title>Generazione miniature con Liferay 6.1.1</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/generazione-miniature-con-liferay-6-1-1</link>
      <description>&lt;p&gt;Lavorando con le proprie entity custom può capitare di dover manipolare delle immagini e, come spesso succede, di dover creare delle miniature di tali immagini.&lt;/p&gt; &lt;p&gt;Chiaramente è sempre possibile creare tutto a mano e salvarlo poi nella document library, ma perchè farlo quando Liferay è in grado di farlo al posto nostro?&lt;/p&gt; &lt;p&gt;La soluzione è incredibilmente semplice ma richiede alcune spiegazioni:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;ImageProcessorUtil.generateImages(fileVersion);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Innanzitutto... cos'è &lt;em&gt;fileVersion&lt;/em&gt;?&lt;/p&gt; &lt;p&gt;Si tratta di un oggetto che contiene alcune meta informazioni sulla nostra immagine (o meglio, sul file generico contenuto nella Document Library) e lo possiamo ottenere nel seguente modo attraverso le classi di utility della Document Library:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;DLFileEntry &lt;/code&gt;&lt;code&gt;imageDLFileEntry = DLFileEntryLocalServiceUtil....&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;long fileVersionId = imageDLFileEntry.getFileVersion()&lt;/code&gt;&lt;code&gt;.getFileVersionId();&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;FileVersion fileVersion = DLAppLocalServiceUtil.getFileVersion(&lt;/code&gt;&lt;code&gt;fileVersionId&lt;/code&gt;&lt;code&gt;);&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ecco, questo è tutto il codice che deve essere scritto. Ma poi, cosa succede?&lt;/p&gt; &lt;p&gt;Succede che Liferay ricava da &lt;em&gt;fileVersion&lt;/em&gt; tutte le informazioni sull'immagine e tenta di generare 3 distinte miniature: quella di default e 2 custom. Sì ok, ma le dimensioni dove le imposto?&lt;/p&gt;  &lt;p&gt;Le dimensioni si possono impostare sovracrivendo alcune property di portale, in particolare:&lt;/p&gt; &lt;p&gt;&lt;code&gt;dl.file.entry.thumbnail.max.height=128&lt;br /&gt;dl.file.entry.thumbnail.max.width=128&lt;br /&gt;dl.file.entry.thumbnail.custom1.max.height=200&lt;br /&gt;dl.file.entry.thumbnail.custom1.max.width=200&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;code&gt;dl.file.entry.thumbnail.custom2.max.height=250&lt;br /&gt;dl.file.entry.thumbnail.custom2.max.width=250&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Volendo, le dimensioni di default si possono anche impostare direttamente dal pannello di controllo di Liferay, nella sezione &lt;em&gt;Server -&amp;gt; File Upload&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Ricordate che le dimensioni non rappresentano l'altezza e larghezza &lt;em&gt;esatta &lt;/em&gt;della miniatura, ma le dimensioni &lt;em&gt;massime &lt;/em&gt;ossia quelle del &lt;em&gt;riquadro &lt;/em&gt;all'interno del quale verrà visualizzata la miniatura; quindi non ci sono problemi di deformazioni perchè l'immagine viene scalata per rientrare nel riquadro.&lt;/p&gt;&lt;p&gt;Quindi quello che succede è che Liferay va a cercare i valori di queste property e se sono diversi da zero, genera una miniatura per ogni tipo e la salva nella Document Library.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Bello! Ma adesso come le visualizzo? Anche questo è abbastanza semplice!&lt;/p&gt;&lt;p&gt;Innanzitutto dobbiamo generare l'indirizzo completo dell'immagine originale e lo facciamo attraverso le solite librerie di Liferay:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;String imageUrl = DLUtil.getPreviewURL(&lt;br /&gt;                      DLAppLocalServiceUtil.getFileEntry(fileEntry.getFileEntryId()),&lt;br /&gt;                      null,&lt;br /&gt;                      themeDisplay,&lt;br /&gt;                      StringPool.BLANK,&lt;br /&gt;                      false,&lt;br /&gt;                      true);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Il significato dei parametri è il seguente:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;DLAppLocalServiceUtil.getFileEntry(fileEntry.getFileEntryId())&lt;/em&gt;, serve per recuperare dalla Document Library l'immagine;&lt;/li&gt;&lt;li&gt;&lt;em&gt;null,&lt;/em&gt; rappresenta la versione del file ma a noi interessa l'ultima e lo mettiamo a &lt;em&gt;null&lt;/em&gt;;&lt;/li&gt;&lt;li&gt;&lt;em&gt;themeDisplay&lt;/em&gt;, come farselo mancare?&lt;/li&gt;&lt;li&gt;&lt;em&gt;StringPool.BLANK&lt;/em&gt;, parametri aggiuntivi della queryString;&lt;/li&gt;&lt;li&gt;&lt;em&gt;false&lt;/em&gt;, non vogliamo che nella URL venga aggiunto il numero di versione;&lt;/li&gt;&lt;li&gt;&lt;em&gt;true&lt;/em&gt;, vogliamo una URL assoluta.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;La chiamata sopra genera una URL simile alla seguente:&lt;/p&gt;&lt;p&gt;&lt;code&gt;http://localhost:8080/documents/15067/28230/filename.jpg/&lt;br /&gt;                      67979c90-ab51-42ed-b3c8-d3721dfafecd&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Inserendo la URL in un browser potremmo vedere l'immagine grande. E la miniatura?&lt;/p&gt;&lt;p&gt;Per visualizzare la miniatura è sufficiente aggiungere un parametro alla URL:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;String thumbUrl = HttpUtil.addParameter(imageUrl, &amp;quot;imageThumbnail&amp;quot;, 1);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Il parametro &lt;em&gt;imageThumbnail&lt;/em&gt; serve proprio a richiedere a Liferay di fornirci la miniatura, e può assumere 3 valori distinti:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;1, per visualizzare la miniatura di default;&lt;/li&gt;&lt;li&gt;2, per visualizzare la miniatura custom1;&lt;/li&gt;&lt;li&gt;3, per visualizzare la miniatura custom2.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ad esempio (lo spezzo per motivi tipografici):&lt;/p&gt;&lt;p&gt;&lt;code&gt;http://localhost:8080/documents/15067/28230/filename.jpg/&lt;br /&gt;                      67979c90-ab51-42ed-b3c8-d3721dfafecd?imageThumbnail=1&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;</description>
      <pubDate>Fri, 22 Feb 2013 13:35:53 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/generazione-miniature-con-liferay-6-1-1</guid>
      <dc:creator>Marco Napolitano</dc:creator>
      <dc:date>2013-02-22T13:35:53Z</dc:date>
    </item>
    <item>
      <title>Deployare portlet custom da pannello di controllo con Liferay 6.1.1</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/deployare-portlet-custom-da-pannello-di-controllo-con-liferay-6-1-1</link>
      <description>&lt;p&gt;Chi di voi ha avuto modo di lavorare con Liferay 6.1.1 si sarà reso conto di un piccolo problema: non è più possibile, attraverso il pannello di controllo, fare l'upload di un WAR della propria portlet (tema o layout che sia).&lt;/p&gt;&lt;p&gt;Il motivo è legato alla recente introduzione del Marketplace e ad una banale svista che ha inibito il caricamento dei WAR.&lt;/p&gt;&lt;p&gt;Ma niente paura, perchè se ne sono accorti ed hanno rilascito un apposito plugin per ovviare al problema: basta accedere alla sezione Utility del Marketplace e cercare &lt;strong&gt;Private Plugin Installer CE&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Una volta installato, accedendo alla sezione &lt;em&gt;Plugins Installation&lt;/em&gt; del portale, troverete un nuovo tab &lt;em&gt;Private Plugin Installer&lt;/em&gt; con il vecchio funzionamento.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Feb 2013 08:46:06 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/deployare-portlet-custom-da-pannello-di-controllo-con-liferay-6-1-1</guid>
      <dc:creator>Marco Napolitano</dc:creator>
      <dc:date>2013-02-15T08:46:06Z</dc:date>
    </item>
    <item>
      <title>Dockbar menù e portlet "rapide"</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/dockbar-menu-e-portlet-rapide</link>
      <description>&lt;p&gt;Quando installate Liferay 6.1 la nuova dockbar mostra questa configurazione iniziale:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://blog.d-vel.com/image/image_gallery?uuid=18435dd2-fcd4-4b74-bb9e-d8692a0d4414&amp;amp;groupId=12536&amp;amp;t=1358924925314" width="269" height="246" title="Dockbar Liferay - Menù rapido" longdesc="Dockbar Liferay - Menù rapido" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Quante volte avete pensato &amp;quot;sarebbe molto comodo avere già qui la portlet che uso più spesso&amp;quot; ma, per pigrizia o perché non è mai una priorità non l'avete mai fatto.&lt;/p&gt;&lt;p&gt;Beh, da oggi potete farlo senza perderci dietro troppo tempo!&lt;/p&gt;&lt;p&gt;Vi basterà modificare questa property aggiungendola al vostro &lt;code&gt;portal-ext.properties&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;##&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;## Dockbar Portlet&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;##&lt;/code&gt;&lt;/p&gt;&lt;p class="p2"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p class="p3"&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &lt;span class="s1"&gt;#&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;&lt;span class="s2"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;# Set the portlet ids that will be shown directly in the &amp;quot;Add Application&amp;quot;&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;&lt;span class="s2"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;# menu.&lt;/code&gt;&lt;/p&gt;&lt;p class="p3"&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &lt;span class="s1"&gt;#&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p class="p3"&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; dockbar.add.portlets=&lt;span class="s3"&gt;56,101,110,71&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p class="p3"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p3"&gt;Come vedete vi basta modificarla indicando gli id dei vostri portlet ed il gioco è fatto!&lt;/p&gt;&lt;p class="p3"&gt;Un'altra incredibile feature ottenuta solamente configurando e non sviluppando! ;)&lt;/p&gt;&lt;p class="p3"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p3"&gt;Alla prossima!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Wed, 23 Jan 2013 07:07:44 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/dockbar-menu-e-portlet-rapide</guid>
      <dc:creator>Jader Jed Francia</dc:creator>
      <dc:date>2013-01-23T07:07:44Z</dc:date>
    </item>
    <item>
      <title>Import / export Liferay lar con eccezione</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/import-export-liferay-lar-con-eccezione</link>
      <description>&lt;p&gt;Tutti avrete pensato che &lt;a href="http://www.liferay.com/community/wiki/-/wiki/Main/Portlet+DataHandlers" target="_blank"&gt;il meccanismo di import / export nativo di Liferay&lt;/a&gt;, quello che vi permette di trasferire all'interno di un file LAR (Liferay Archive) le vostre singole righe del database come file XML fosse una vera figata!&lt;/p&gt; &lt;p&gt;La possibilità di sviluppare su un database di test e poi &amp;quot;esportare e importare&amp;quot; su un database di produzione &lt;strong&gt;potenzialmente differente&lt;/strong&gt; rispetto a quello dal quale avete esportato, senza preoccuparvi di nulla, è indubbiamente una funzionalità che chi, come noi, sviluppa progetti apprezza to-cour.&lt;/p&gt; &lt;p&gt;Peccato che molti lamentano che, al momento dell'import, vengano sollevate eccezioni incomprensibili anche quando esportano solamente qualche pagina di prova!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Lo so: la metà dei miei capelli bianchi è data dal meccanismo di import / export dei LAR di Liferay, soprattutto perché questo meccanismo è anche alla base della pubblicazione da staging verso active, sul quale ho già scritto qualche cosa in passato.. :)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Vorrei però condividere con voi un paio di cose che, nella versione 6.1 di Liferay, si deve considerare quando si fa questo tipo di operazione, così che voi possiate beneficiare dei miei capelli bianchi senza farvene troppi dei vostri! ;)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Queste sono le due regole auree che vi consiglio di controllare &lt;strong&gt;__SEMPRE__&lt;/strong&gt; quando il meccanismo di import si rompe:&lt;/p&gt; &lt;ol&gt;     &lt;li&gt;il portale dal quale avete esportato ha la lingua di default &lt;strong&gt;UGUALE&lt;/strong&gt; al portale sul quale state cercando di importare&lt;/li&gt;     &lt;li&gt;tutte le strutture e i template dell'applicazione del CMS (il Journal..) &lt;strong&gt;NON contengono&lt;/strong&gt; spazi all'interno dei nomi!&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;E badate bene: per il punto 2 intendo _in tutti i nomi_ anche quelli delle lingue tradotte!!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Escludo ovviamente che stiate provando ad esportare / importare da versioni diverse di Liferay, perché questo è un problema già noto.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Spero che con questi due accogimenti riusciate a importare / esportare contenuti senza diventare pazzi!!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Ovviamente se poi avete ancora eccezioni, il consiglio, aimè, è sempre il solito: attaccate il debugger e.. Buon lavoro! ;)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Alla prossima!&lt;/p&gt;</description>
      <pubDate>Tue, 22 Jan 2013 16:12:25 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/import-export-liferay-lar-con-eccezione</guid>
      <dc:creator>Jader Jed Francia</dc:creator>
      <dc:date>2013-01-22T16:12:25Z</dc:date>
    </item>
    <item>
      <title>Liferay e Direct Web Remote</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/liferay-e-direct-web-remote</link>
      <description>&lt;p&gt;Chi lavora con Liferay molto probabilmente conosce il Service Builder e tutto lo strato di persistenza che esso genera.&lt;/p&gt;&lt;p&gt;Però forse non tutti sanno che Liferay è in grado di generare e di mettere a disposizione il medesimo strato di persistenza direttamente in pagina, con Javascript, effettuando in maniera del tutto trasparente le chiamate Ajax necessarie.&lt;/p&gt;&lt;p&gt;Vediamo come fare... e poi mi ringrazierete! &lt;img src="http://blog.d-vel.com/html/js/editor/fckeditor/editor/images/smiley/msn/regular_smile.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Innanzitutto create in Eclipse un progetto portlet; per comodità chiamatelo &lt;em&gt;DirectWebRemoteTest&lt;/em&gt; (così coincidono gli esempi di codice sotto). Aggiungete anche il suo file XML del Service Builder; dopodichè inserite questa entità di prova:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;entity name=&amp;quot;Car&amp;quot; local-service=&amp;quot;true&amp;quot; &lt;strong&gt;remote-service=&amp;quot;true&amp;quot; json-enabled=&amp;quot;true&amp;quot;&lt;/strong&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;carId&amp;quot; type=&amp;quot;long&amp;quot; primary=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;model&amp;quot; type=&amp;quot;String&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;cabrio&amp;quot; type=&amp;quot;boolean&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;column name=&amp;quot;hp&amp;quot; type=&amp;quot;int&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;order by=&amp;quot;asc&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;order-column name=&amp;quot;model&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;order-column name=&amp;quot;cabrio&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;order-column name=&amp;quot;hp&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/order&amp;gt;&lt;br /&gt;&amp;lt;/entity&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Non entro nel dettaglio della entità, che dovrebbe risultare ovvio, ma segnalo solamente i 2 attributi in grassetto che devono essere impostati a true.&lt;/p&gt;&lt;p&gt;A questo punto lanciamo uno dopo l'altro i seguenti 2 target dello script Ant del progetto:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;build-service;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;build-wsdd&lt;/em&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Una volta terminata l'esecuzione dei 2 target, è già stata creata gran parte di quello che ci serve; prima di procedere dobbiamo decidere quali metodi devono essere accessibili via Javascript in pagina. Supponiamo quindi di voler esporre i metodi:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;getCar(long carId)&lt;/em&gt;, che restituisce la singola entità;&lt;/li&gt;&lt;li&gt;&lt;em&gt;getCars()&lt;/em&gt;, che restituisce tutte le entità.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Apriamo quindi la classe &lt;em&gt;CarServiceImpl&lt;/em&gt;&amp;nbsp;che, essendo appena stata generata, sarà vuota.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Attenzione:&lt;/strong&gt; la classe da usare è &lt;em&gt;CarServiceImpl &lt;/em&gt;e non &lt;em&gt;CarLocalServiceImpl&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Una volta aperta la classe, aggiungiamo i 2 metodi da esporre come di seguito:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;public &lt;strong&gt;CarSoap getCar&lt;/strong&gt;(long carId) throws SystemException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return CarSoap.toSoapModel(carPersistence.fetchByPrimaryKey(carId));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public &lt;strong&gt;CarSoap[] getCars&lt;/strong&gt;() throws SystemException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return CarSoap.toSoapModels(carPersistence.findAll());&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Come sono strutturati questi metodi?&lt;/p&gt;&lt;p&gt;Innanzitutto notiamo l'utilizzo della classe &lt;em&gt;CarSoap&lt;/em&gt;, generata dal Service Builder, che di fatto è un wrapper del model &lt;em&gt;Car&lt;/em&gt;. Dopodichè il contenuto di ciascun metodo non è altro che una normale chiamata allo strato di persistenza, wrappata però dalla classe &lt;em&gt;CarSoap&lt;/em&gt; che converte gli oggetti restituiti,&amp;nbsp;in modo da avere in pagina qualcosa di &lt;em&gt;utilizzabile&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;A questo punto lanciamo nuovamente uno dopo l'altro i 2 target dello script Ant del progetto:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;build-service;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;build-wsdd&lt;/em&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Una volta terminata l'esecuzione dei 2 target, apriamo il file &lt;em&gt;docroot/js/service.js&lt;/em&gt;; dovreste avere una cosa del genere:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Liferay.Service.register(&amp;quot;Liferay.Service.dwr&amp;quot;, &amp;quot;it.dvel.dwr.portlet.service&amp;quot;,&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;                         &amp;quot;DirectWebRemoteTest-portlet&amp;quot;);&lt;br /&gt;&lt;br /&gt;Liferay.Service.registerClass(&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    // Liferay.Service.dwr rappresenta una sorta di namespace&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    // &amp;quot;Car&amp;quot; è il nome dell'oggetto Javascript&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Liferay.Service.dwr, &amp;quot;Car&amp;quot;,&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;getCar&lt;/strong&gt;: true,  // questo è il nome del primo metodo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;getCars&lt;/strong&gt;: true  // questo è il nome del secondo metodo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;La parte cruciale è tutto quanto segue la prima riga, ossia la registrazione della classe &lt;em&gt;Car&lt;/em&gt; ed il censimento dei metodi che abbiamo esposto in precedenza. Questo file non deve essere manipolato dallo sviluppatore, vi ho solo mostrato come era stato modificato dal Service Builder.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A questo punto, chiamate un vostro amico e fategli inserire qualche record nel db...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Una volta inserito qualche record in tabella, possiamo procedere con l'ultimo step: il codice da inserire in pagina.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/DirectWebRemoteTest-portlet/js/service.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;aui:fieldset label=&amp;quot;Single car&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div &lt;strong&gt;id=&amp;quot;car&amp;quot;&lt;/strong&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/aui:fieldset&amp;gt;&lt;br /&gt;&amp;lt;aui:fieldset label=&amp;quot;All cars&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div &lt;strong&gt;id=&amp;quot;cars&amp;quot;&lt;/strong&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/aui:fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;aui:script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUI().ready('aui-base', function(A) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var carId = /* mettete un qualche valore di chiave primaria */;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Liferay.Service.dwr.Car.getCar&lt;/strong&gt;({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; carId: carId&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function(car) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; A.one(&amp;quot;#car&amp;quot;).html(car.model);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Liferay.Service.dwr.Car.getCars&lt;/strong&gt;({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function(cars) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var desc = '';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=0; i &amp;lt; cars.length; i++)&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; desc += cars[i].model + &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; A.one(&amp;quot;#cars&amp;quot;).html(desc);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;lt;/aui:script&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;La prima cosa fondamentale è inserire il riferimento al file &lt;em&gt;service.js&lt;/em&gt; che abbiamo visto prima; Liferay non lo inserisce da solo, quindi occhio a non dimenticarlo.&lt;/p&gt;&lt;p&gt;Dopodichè ho inserito un pò di codice HTML per posizionare alcuni &lt;em&gt;&amp;lt;div&amp;gt;&lt;/em&gt; che verranno riempiti mediante Alloy; niente di che, fate solo caso al valore di &lt;em&gt;id&lt;/em&gt; usato.&lt;/p&gt;&lt;p&gt;Infine, il codice vero e proprio, al caricamento della pagina invoco prima un metodo (che mi restituisce un unico record) poi l'altro (che li restituisce tutti); oh è solo un esempio!&lt;/p&gt;&lt;p&gt;Qual'è la sintassi esatta dell'invocazione? E' tutto quanto contenuto nel blocco &lt;em&gt;Liferay.Service.registerClass&lt;/em&gt; del file &lt;em&gt;service.js&lt;/em&gt;, ossia il namespace ed il nome dell'oggetto Javascript, seguito dal nome del metodo:&lt;/p&gt;&lt;p&gt;&lt;strong style="font-family: 'Courier New', Courier, monospace; white-space: pre;"&gt;Liferay.Service.dwr.Car.getCar&lt;/strong&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; white-space: pre;"&gt;(&amp;lt;A&amp;gt;, &amp;lt;B&amp;gt;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ogni metodo generato da Liferay ed utilizzabile in pagina ha 2 parametri.&lt;/p&gt;&lt;p&gt;Il primo parametro rappresenta un oggetto JSON contenente tutti i parametri; nel caso non ci siano parametri va comunque passato un oggetto JSON vuoto (ossia &lt;em&gt;{}&lt;/em&gt;).&lt;/p&gt;&lt;p&gt;Il secondo parametro è la funzione di callback che viene invocata al termine dell'esecuzione del metodo dello strato di persistenza (ossia quello implementato nella classe&amp;nbsp;&lt;em&gt;CarServiceImpl&lt;/em&gt;); il parametro della funzione di callback (il nome è a scelta dello sviluppatore) è l'oggetto restituito dal metodo&amp;nbsp;nella classe&amp;nbsp;&lt;em&gt;CarServiceImpl&lt;/em&gt;. Quindi per il metodo &lt;em&gt;getCar&lt;/em&gt; il parametro è di tipo &lt;em&gt;CarSoap&lt;/em&gt;; mentre per il metodo &lt;em&gt;getCars&lt;/em&gt; il parametro è di tipo &lt;em&gt;CarSoap[]&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A questo punto potete farne quello che volete.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;</description>
      <pubDate>Thu, 29 Nov 2012 16:22:27 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/liferay-e-direct-web-remote</guid>
      <dc:creator>Marco Napolitano</dc:creator>
      <dc:date>2012-11-29T16:22:27Z</dc:date>
    </item>
    <item>
      <title>Liferay e refresh di una portlet con Alloy UI</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/liferay-e-refresh-di-una-portlet-con-alloy-ui</link>
      <description>&lt;p&gt;Recentemente mi è capitato di dover gestire una situazione un pò &amp;quot;articolata&amp;quot; relativamente all'interazione in pagina tra 2 portlet, con Ligeray 6.1.1.&lt;/p&gt; &lt;p&gt;Senza entrare nel dettaglio, poco interessante per il lettore, segnalo solamente che non era possibile utilizzare nè public render parameter nè eventi.&lt;/p&gt; &lt;p&gt;Pertanto, in un momento di euforia (o di follia...), mi è venuto in mente di tentare di effettuare da una portlet il refresh di un'altra portlet, senza passare dal server ma facendo tutto in pagina con Alloy.&lt;/p&gt; &lt;p&gt;Dopo un pò di prove e di reverse engineering sui sorgenti del portale ecco la soluzione, quasi troppo semplice, che vi riporto nel caso vi servisse:&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;lt;aui:script use=&amp;quot;aui-base&amp;quot;&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;var data = {&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;    portletAjaxable: true,&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;    param1: value1,&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;    param2: value2,&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;    ...&lt;br /&gt;};&lt;br /&gt;Liferay.Portlet.refresh('#p_p_id_&amp;lt;PORTLETID&amp;gt;_', data);&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;lt;/aui:script&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Cominciamo dal fondo per capire come funziona.&lt;/p&gt; &lt;p&gt;La funzione da invocare si chiama, guarda caso, &lt;em&gt;refresh&lt;/em&gt; ed è contenuta nell'oggetto globale &lt;em&gt;Liferay.Portlet&lt;/em&gt;; tale funzione richiede 2 parametri:&lt;/p&gt; &lt;ol&gt;     &lt;li&gt;il primo parametro è l'identificativo (in termini di HTML) del contenitore della portlet e si ricava unendo il prefisso &lt;em&gt;#p_p_id_&lt;/em&gt; con l'identificativo della portlet che deve essere refreshata (ad esempio &lt;em&gt;2_WAR_MiaPortlet&lt;/em&gt;), il tutto chiuso dall'underscore (occhio a non dimenticarlo!);&lt;/li&gt;     &lt;li&gt;il secondo parametro è un oggetto JSON contenente gli eventuali parametri da inviare alla portlet.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Quello che succede quando la funzione &lt;em&gt;refresh&lt;/em&gt; viene invocata è una chiamata Ajax di tipo renderURL a cui vengono passati tutti i parametri. Pertanto nel metodo &lt;em&gt;doView&lt;/em&gt; della seconda portlet è possibile recuperare i parametri normalmente e fare quello che serve:&lt;/p&gt; &lt;p&gt;&lt;code&gt;@Override&lt;br /&gt;public void doView(RenderRequest renderRequest,&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;                   RenderResponse renderResponse)&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;                   throws IOException, PortletException {&lt;br /&gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;    String value1 = ParamUtil.getString(renderRequest, &amp;quot;param1&amp;quot;);&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String value2 = ParamUtil.getString(renderRequest, &amp;quot;param2&amp;quot;);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    // altri parametri...&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    renderRequest.setAttribute(&amp;quot;param1&amp;quot;, value1);&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    renderRequest.setAttribute(&amp;quot;param2&amp;quot;, value2);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;    // altri parametri...&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;code&gt;    super.doView(renderRequest, renderResponse);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;</description>
      <pubDate>Mon, 12 Nov 2012 11:16:46 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/liferay-e-refresh-di-una-portlet-con-alloy-ui</guid>
      <dc:creator>Marco Napolitano</dc:creator>
      <dc:date>2012-11-12T11:16:46Z</dc:date>
    </item>
    <item>
      <title>Configurare virtual host per domini con caratteri non-ASCII</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/configurare-virtual-host-per-domini-con-caratteri-non-ascii</link>
      <description>&lt;p&gt;Ebbene si, quel giorno è arrivato. Il giorno in cui un cliente ci ha chiesto di gestire un dominio contenente caratteri non-ASCII (nel caso specifico lettere accentate).&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Da che mondo è mondo, cioè da quanto esistono i DNS, i nomi di dominio posso contenere solamente caratteri ASCII &lt;a href="http://it.wikipedia.org/wiki/ASCII#Tabella_dei_caratteri"&gt;it.wikipedia.org/wiki/ASCII#Tabella_dei_caratteri&lt;/a&gt;, escludendo di fatto non solo tutti gli ideogrammi della lingua araba, cinese, giapponese, ecc. ma più semplicemente anche le nostre e care lettere accentate.&lt;/p&gt;&lt;p&gt;Anni fa qualcuno però ha deciso che questa ingiustizia doveva finire e ha voluto a tutti i costi che venissero accettati anche domini con caratteri non-ASCII. Ma ormai la frittata era fatta, perché tutti i protocolli su cui si basa internet utilizzano codifiche ASCII. Ma questo qualcuno voleva a tutti i costi questi domini internazionali &lt;a href="http://it.wikipedia.org/wiki/Nome_di_dominio_internazionalizzato"&gt;it.wikipedia.org/wiki/Nome_di_dominio_internazionalizzato&lt;/a&gt;&amp;nbsp;perciò ha deciso bene di inventarsi una codifica chiamata Punycode &lt;a href="http://it.wikipedia.org/wiki/Punycode"&gt;it.wikipedia.org/wiki/Punycode&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Senza entrare nel dettaglio dell'algoritmo di codifica (che secondo me non l'ha capito nemmeno quello che l'ha inventato) basta sapere che punycode non fa altro che &amp;quot;convertire&amp;quot; un dominio non-ASCII in una stringa ASCII. In particolare viene aggiunto al dominio un prefisso &lt;em&gt;xn-- &lt;/em&gt;seguito dal nome del dominio al quale vengono sostituiti i caratteri non-ASCII con caratteri ASCII.&lt;/p&gt;&lt;p&gt;Ad esempio, il dominio www.caffè.it viene confertito in www.xn--caff-8oa.it.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I browser recenti (IE a partire dalla versione 6 tramite l'utilizzo di un plugin) sono in grado di gestire la codifica punycode, perciò quando digitate l'URL http://www.caffè.it si occuperanno in maniera totalmente trasprarente per l'utente di convertire la URL in http://www.xn--caff-8oa.it. Perciò il vostro browser farà prima una query al DNS utilizzando www.xn--caff-8oa.it e invierà la richiesta al web server sempre utilizzando l'hostname www.xn--caff-8oa.it.&lt;/p&gt;&lt;p&gt;Detto ciò, come dovrò configurare Apache, Tomcat o qualsiasi altro webserver/application server? Semplicemente utilizzando il dominio nel formato ASCII. Nel nostro caso:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;ServerName www.xn--caff-8oa.it&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Ora vi starete chidendo: ma come faccio a sapere qual'è l'equivalente ASCII del mio dominio non-ASCII. Beh, io non lo so, ma ci sono molti convertitori online che possono diverlo:&lt;/p&gt;&lt;p&gt;&lt;a href="http://mct.verisign-grs.com/conversiontool/convertServlet"&gt;mct.verisign-grs.com/conversiontool/convertServlet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.charset.org/punycode.php"&gt;www.charset.org/punycode.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Sat, 10 Nov 2012 19:12:51 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/configurare-virtual-host-per-domini-con-caratteri-non-ascii</guid>
      <dc:creator>Simone Celli Marchi</dc:creator>
      <dc:date>2012-11-10T19:12:51Z</dc:date>
    </item>
    <item>
      <title>Come fare backup di un DB MySQL</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/come-fare-backup-di-un-db-mysql</link>
      <description>&lt;p&gt;Ieri, alcuni ragazzi con cui stavo lavorando, hanno avuto la necessità di fare un backup del database di Liferay prima di fare upgrade di versione.&lt;/p&gt;&lt;p&gt;Quando ho visto il modo con cui l'hanno fatto sono rimasto stupito e gli ho chiesto di farmi avere le stringhe che hanno utilizzato!&lt;/p&gt;&lt;p&gt;Siccome è una cosa che hanno fatto da command line senza l'utilizzo dell'interfaccia grafica, ho pensato fosse molto comodo e ve lo riporto qui sotto -sai mai che sugli ambienti di produzione dobbiate fare la stessa cosa e non avete a disposizione un ambiente grafico.. ;)-:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;p class="p1"&gt;&lt;code&gt;# Prima creo il DB dove metterò i dati&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;mysqladmin create lr610_bck -u user --password=xxxx&lt;/code&gt;&lt;/p&gt;&lt;p class="p2"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;# Poi eseguo un Export / Import&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;code&gt;mysqldump -u liferay --password=liferay liferay610 | mysql -u user --password=xxxx lr610_bck&lt;/code&gt;&lt;/p&gt;&lt;p class="p1"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p1"&gt;Pratico, semplice e veloce, no? :)&lt;/p&gt;&lt;p class="p1"&gt;Alla prossima!&lt;/p&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 31 Oct 2012 04:51:33 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/come-fare-backup-di-un-db-mysql</guid>
      <dc:creator>Jader Jed Francia</dc:creator>
      <dc:date>2012-10-31T04:51:33Z</dc:date>
    </item>
    <item>
      <title>Come mostrare i tag di un web content da dentro un template velocity</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/come-mostrare-i-tag-di-un-web-content-da-dentro-un-template-velocity</link>
      <description>&lt;p&gt;&amp;nbsp;Ciao a tutti!&lt;/p&gt;&lt;p&gt;La scorsa settimana, mentre stavo tenendo un &lt;a href="http://www.d-vel.com/web/dvel/formazione-liferay"&gt;corso su Liferay&lt;/a&gt; ad alcuni amici, siamo incappati in un caso d'uso che necessitava di mostrare, all'interno di un template di velocity, i tag collegati ad un contenuto realizzato con il CMS interno di Liferay (il Journal, appunto! :)).&lt;/p&gt;&lt;p&gt;Dopo aver combattuto un po' siamo riusciti a realizzare il caso; ho pensato quindi di postare qui la soluzione a beneficio di tutti! :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Questo il codice:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;code&gt;#set ($tagsService = &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;     $serviceLocator.findService(&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;         &amp;quot;com.liferay.portlet.asset.service.AssetTagLocalService&amp;quot;))&lt;br /&gt;#set ($journalArticleResourceService = &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;     $serviceLocator.findService(&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;         &amp;quot;com.liferay.portlet.journal.service.JournalArticleResourceLocalService&amp;quot;))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;#set ($longGroupId = $getterUtil.getLong($groupId))&lt;br /&gt;#set ($articleResourcePK = &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;     $journalArticleResourceService.getArticleResourcePrimKey(&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;         $longGroupId, $reserved-article-id.data))&lt;br /&gt;#set ($tagsEntries = &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;     $tagsService.getTags(&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;         &amp;quot;com.liferay.portlet.journal.model.JournalArticle&amp;quot;, $articleResourcePK))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Tags:&lt;br /&gt;#foreach ($entry in $tagsEntries)&lt;br /&gt;#set ($tag = $entry.getName())&lt;br /&gt;#if ($velocityCount != 1), #end&lt;br /&gt;$tag#end&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;E ora un po' di spiegazioni! ;)&lt;/p&gt;&lt;p&gt;Se andate a vedere nel codice dei sorgenti di portale la classe&amp;nbsp;&lt;code&gt;com.liferay.portal.velocity.VelocityVariablesImpl&lt;/code&gt; potete vedere tutte le variabili che LR vi passa dentro al template.&lt;/p&gt;&lt;p&gt;Quella che a noi interessa di più è quella che viene passata con la chiave &amp;quot;&lt;code&gt;serviceLocator&amp;quot;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Questo oggetto, infatti, ci permette, attraverso un meccanismo interno a LR, di ottenere, sempre dentro al nostro template velocity, istanze di oggetti Service di LR.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Una volta ottenuti quelli che ci servono, poi, possiamo comodamente invocarne i metodi come faremmo in una classe java o in un file JSP.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Spero d'esservi stato d'aiuto!&lt;/p&gt;&lt;p&gt;Se avete dubbi e/o problemi non esitate a chiedere nei commenti qui sotto! :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Alla prossima! :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;P.S. Abbiamo pubblicato la pagina del corso su Linkedin; se sei stato nostro cliente &lt;a href="http://it.linkedin.com/company/d-vel/courses-on-liferay-platform-1081660/product?trk=biz_product"&gt;scrivici una recensione&lt;/a&gt;! :)&lt;/p&gt;</description>
      <pubDate>Tue, 30 Oct 2012 13:47:31 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/come-mostrare-i-tag-di-un-web-content-da-dentro-un-template-velocity</guid>
      <dc:creator>Jader Jed Francia</dc:creator>
      <dc:date>2012-10-30T13:47:31Z</dc:date>
    </item>
    <item>
      <title>Criptare i dati in Java con chiave asimmetrica</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/criptare-i-dati-in-java-con-chiave-asimmetrica</link>
      <description>&lt;p&gt;Può capitare di dover realizzare dei moduli di registrazione o di sicurezza per i quali è necessario implementare meccanismi di cifratura a chiave asimmetrica.&lt;/p&gt;  &lt;div&gt;In questo breve post si mostreranno dei metodi di utilità per la generazione di chiavi asimettriche con l&amp;rsquo;algoritmo RSA:&lt;/div&gt;  &lt;div&gt;Per generare una coppia di chiavi(pubblica e privata) basta eseguire il seguente codice:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border: none; "&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="652" valign="top" style="width:488.9pt;border:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.KeyPair;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   java.security.KeyPairGenerator;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; &lt;span style="background:silver;"&gt;java.security.NoSuchAlgorithmException&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   java.security.NoSuchProviderException;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.PrivateKey;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.PublicKey;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.SecureRandom;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; background-color: silver; background-position: initial initial; background-repeat: initial initial; "&gt;KeyPairGenerator&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt; keyGen;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;keyGen = &lt;span style="background:silver;"&gt;KeyPairGenerator&lt;/span&gt;.&lt;i&gt;getInstance&lt;/i&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt;color:#2A00FF;"&gt;&amp;quot;RSA&amp;quot;&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;SecureRandom random = SecureRandom.&lt;i&gt;getInstance&lt;/i&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt;color:#2A00FF;"&gt;&amp;quot;SHA1PRNG&amp;quot;&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;, &lt;/span&gt;&lt;span style="font-size:10.0pt;
  color:#2A00FF;"&gt;&amp;quot;SUN&amp;quot;&lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;keyGen.initialize(1024, random);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;KeyPair pair = keyGen.generateKeyPair();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;PublicKey&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;color:#0000C0;"&gt; dVelPrivateKey&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; "&gt; = pair.getPrivate();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;PrivateKey&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;color:#0000C0;"&gt; dVelPublicKey&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; "&gt; =   pair.getPublic();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 10pt; line-height: 115%; "&gt;Il metodo getInstance della classe SecureRandom accetta come argomenti il nome di un algoritmo ed il provider.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;    &lt;div&gt;&lt;span style="font-size: 10pt; line-height: 115%; "&gt;Il seguente metodo invece serve per la cifratura/decifratura dei dati:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div align="center"&gt;&lt;table border="1" cellspacing="0" cellpadding="0" style="border: none; "&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="652" valign="top" style="width:488.9pt;border:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   javax.crypto.BadPaddingException;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; javax.crypto.Cipher;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   javax.crypto.IllegalBlockSizeException;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   javax.crypto.NoSuchPaddingException;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.math.BigInteger;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.InvalidKeyException;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.Key;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; java.security.KeyFactory;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;private&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;static&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;byte&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;[] doCipher(Key cipherKey,&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;byte&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;[] input,&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;boolean&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; encrypt)&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;throws&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   DVelLicenseException{&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;try&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;{&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; Cipher cipher   = Cipher.&lt;i&gt;getInstance&lt;/i&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;color:#0000C0;"&gt;XFORM&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; "&gt;);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;(encrypt)&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cipher.init(Cipher.&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;color:#0000C0;"&gt;ENCRYPT_MODE&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; "&gt;,cipherKey);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cipher.init(Cipher.&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;color:#0000C0;"&gt;DECRYPT_MODE&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; "&gt;, cipherKey);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   cipher.doFinal(input);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   (NoSuchAlgorithmException e) {&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   DVelLicenseException(e.getMessage());&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;(NoSuchPaddingException   e){&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   DVelLicenseException(e.getMessage());&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;(InvalidKeyException   e){&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   DVelLicenseException(e.getMessage());&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   (IllegalBlockSizeException e) {&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   DVelLicenseException(e.getMessage());&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   (BadPaddingException e) {&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;throw&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; &lt;u&gt;DVelLicenseException&lt;/u&gt;(e.getMessage());&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;  &lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Un altro metodo utile è quello per creare una chiave a partire da un array di bytes,questo potrebbe tornare utile per il salvataggio delle chiavi su file :&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border: none; "&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="652" valign="top" style="width:488.9pt;border:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 0, 85); "&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;java.security.NoSuchAlgorithmException;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 0, 85); "&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;java.security.spec.InvalidKeySpecException;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 0, 85); "&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;java.security.spec.X509EncodedKeySpec;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;public&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;static&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; Key createKeyFromByte(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;boolean&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; publicKey,&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;byte&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;[]   keyEncoded){&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;try&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;{&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; KeyFactory   keyFactory = KeyFactory.&lt;i&gt;getInstance&lt;/i&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10.0pt;color:#0000C0;"&gt;XFORM&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; "&gt;);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; X509EncodedKeySpec   keySpec = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt; X509EncodedKeySpec(keyEncoded);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;(publicKey)&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   keyFactory.generatePublic(keySpec);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   keyFactory.generatePrivate(keySpec);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;(NoSuchAlgorithmException   e){&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; } &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;   (InvalidKeySpecException e) {&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:#7F0055;"&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; "&gt;;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; &lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;}&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;}&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description>
      <pubDate>Mon, 24 Sep 2012 10:44:39 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/criptare-i-dati-in-java-con-chiave-asimmetrica</guid>
      <dc:creator>Aristide Cittadino</dc:creator>
      <dc:date>2012-09-24T10:44:39Z</dc:date>
    </item>
    <item>
      <title>Creazione Albero di categorie in Liferay</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/creazione-albero-di-categorie-in-liferay</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Supponiamo di dover creare manualmente un albero di categorizzazione in liferay non utilizzando le classi di utilità del framework ma di doverli inserire a &amp;ldquo;manualmente&amp;rdquo; nel database.&lt;/div&gt;  &lt;div&gt;Questa necessità potrebbe verificarsi ad esempio nella migrazione dati da una versione di liferay ad un'altra senza dover mettere in piedi il meccanismo dei web services ma utilizzando semplicemente degli statements JDBC.&lt;/div&gt;  &lt;div&gt;Prima di addentrarci nel codice è necessario spendere due parole sulla struttura delle tabelle delle categorie in liferay 606.&lt;br /&gt; Le tabelle coinvolte nella categorizzazione sono principalmente due :&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;-&lt;b&gt;assetvocabulary&lt;/b&gt;: Dove vengono inseriti tutti i vocabolari creati&lt;/div&gt;  &lt;div&gt;-&lt;b&gt;assetcategory&lt;/b&gt;: Dove vengono inserite le categorie di tutti i vocabolari con la relazione al genitore.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Altra cosa molto importante è che liferay utilizza una generazione &amp;ldquo;propria&amp;rdquo; degli id delle entità del database.&lt;/div&gt;  &lt;div&gt;Facendo un&amp;rsquo;inserimento manuale è necessario quindi gestire anche la numerazione &amp;nbsp;facendo in modo che liferay riesca ad adattarsi alla nostra modifica.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font size="6"&gt;Gestione degli id di insert&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Prima di qualsiasi operazione di insert sulle tabelle citate precedentemente è necessario conoscere l&amp;rsquo;ultimo id che è stato assegnato in modo da inserire i successivi progressivamente.&lt;/div&gt;  &lt;div&gt;La tabella deputata alla gestione degli id in liferay è la tabella Counter, ed in questo caso gli id delle tabelle sono gestiti proprio dall&amp;rsquo;entity che ha il campo &amp;ldquo;name&amp;rdquo; uguale a &amp;ldquo;com.liferay.counter.model.Counter&amp;rdquo;.&lt;/div&gt;  &lt;div&gt;Quindi per recuperare il primo id utile da utilizzare andremo a scrivere un frammento di codice del genere:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border: none; "&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="652" valign="top" style="width:488.9pt;border:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; background-color: silver; background-position: initial initial; background-repeat: initial initial; "&gt;String&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt; sqlSelectCategoryStartingId = &lt;/span&gt;&lt;span style="font-size:7.0pt;color:#2A00FF;"&gt;&amp;quot;select currentId from counter where name =   'com.liferay.counter.model.Counter'&amp;quot;&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt;;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; background-color: silver; background-position: initial initial; background-repeat: initial initial; "&gt;String&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt; updateCategoryCounterId = &lt;/span&gt;&lt;span style="font-size:
  7.0pt;color:#2A00FF;"&gt;&amp;quot;update   counter&amp;nbsp; set currentId = ? where   name='com.liferay.counter.model.Counter'&amp;quot;&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt;;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&gt;PreparedStatement selectCategoryStartingIdStat = &lt;/span&gt;&lt;span style="font-size:7.0pt;color:#0000C0;"&gt;lr6Database&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt;.prepareStatement(sqlSelectCategoryStartingId);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&gt;PreparedStatement updateCounterId = &lt;/span&gt;&lt;span style="font-size:7.0pt;color:#0000C0;"&gt;lr6Database&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt;.prepareStatement(updateCategoryCounterId);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&gt;ResultSet categoryStartingIdRes =   selectCategoryStartingIdStat.executeQuery();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;long&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt; assetEntryId = 1;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;(categoryStartingIdRes.next())&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; text-indent: 35.4pt; "&gt;&lt;span style="font-size: 7pt; "&gt;assetEntryId = categoryStartingIdRes.getLong(1);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&gt;.&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 7pt; "&gt;.inserimento   utilizzando come id della query assetEntryId ed incrementandolo per ogni   insert&amp;hellip;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&gt;updateCounterId.setLong(1, assetEntryId);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;Questo frammento di codice andrà utilizzato sempre nel momento in cui si vanno a fare operazioni di insert manuali su tabelle di liferay o comunque su tabelle per le quali la numerazione è gestita dalla tabella counter.&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;ATTENZIONE: &lt;/b&gt;Non tutti gli id sono gestiti tramite l&amp;rsquo;entity con attributo &amp;nbsp;&amp;ldquo;name&amp;rdquo; pari a &amp;nbsp;&amp;ldquo;com.liferay.counter.model.counter&amp;rdquo;, ma bisogna capire (sbirciando sulle tabelle e facendo delle prove inserendo entità da liferay) qual è il &amp;ldquo;name&amp;rdquo; di riferimento per la entity per la quale si vuole conoscere il primo id disponibile.&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font size="6"&gt;Creazione Vocabolari e Categorie&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Per prima cosa si deve creare un vocabolario nel quale le categorie andranno inserite,questo è abbastanza semplice ,basta creare una query di insert:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: smaller; "&gt;&lt;span style="color: rgb(42, 0, 255); "&gt;insert into assetvocabulary (uuid_,vocabularyId,companyId,groupId,userId,username,createDate,modifiedDate,name,title) &amp;nbsp;VALUES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (?,?,?,?,?,?,Now(),Now(),?,?)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;fatto questo ,per l&amp;rsquo;inserimento di una categoria all&amp;rsquo;interno di un vocabolario basta eseguire la query di insert sottostante:&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: smaller; "&gt;&lt;span style="color: rgb(42, 0, 255); "&gt;insert into assetcategory (uuid_,categoryId,companyId,groupId,userId,username,createDate,modifiedDate,parentCategoryId,leftCategoryId,rightCategoryId,name,title,vocabularyId)&amp;nbsp; VALUES &amp;nbsp;(?,?,?,?,?,?,Now(),Now(),?,0,0,?,?,?)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;ATTENZIONE: i campi &amp;lsquo;vocabularyId&amp;rsquo; e &amp;lsquo;categoryId&amp;rsquo; devono essere valorizzati con progressivi che partono dal contenuto della tabella counter, come detto nel paragrafo precedente.&lt;/b&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;Come si può notare la procedura è molto semplice.&lt;/div&gt;  &lt;p&gt;&lt;divre style="text-align:justify;background:#E6E6E6"&gt;&lt;span style="font-size:11.0pt;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;Times New Roman&amp;quot;;"&gt;Per la generazione di un valore valido per il campo&amp;lsquo;uuid&amp;rsquo; può essere utilizzata la class java UUIDinvocando il metodo&lt;/span&gt; UUID.randomUUID().  &lt;/divre&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0.0001pt; "&gt;Per i valori di &amp;lsquo;leftcategoryid&amp;rsquo; e &amp;lsquo;righcategoryid&amp;rsquo; inizialmente si popolano con il valore 0.&lt;/p&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;Ultima accortezza è che per poter permettere effettivamente liferay di ricercare le entry associate alle categories bisogna numerare tutti i nodi dell&amp;rsquo;albero (per ogni group id) tramite un algoritmo ricorsivo che va a ricalcolare i valori di &amp;lsquo;leftcategoryid&amp;rsquo; e &amp;lsquo;rightcategoryid&amp;rsquo;. Esiste il metodo &amp;ldquo;rebuild tree&amp;rdquo; in liferay che fa una cosa simile, ma nell&amp;rsquo;eventualità in cui il codice viene eseguito dall&amp;rsquo;esterno dell&amp;rsquo;ambiente, il codice di seguito potrebbe tornarvi utile:&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border: none; "&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="652" valign="top" style="width:488.9pt;border:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt; &lt;span style="background:silver;"&gt;rebuildTree&lt;/span&gt;(Connection lr6Database) &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;throws&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;   SQLException{&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;long&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;   parentCategoryId = -1;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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; String   getAncestorsSql&amp;nbsp; = &lt;/span&gt;&lt;span style="font-size:7.0pt;color:#2A00FF;"&gt;&amp;quot;select categoryId from assetcategory where   groupId = ? and parentCategoryId = 0&amp;quot;&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt;;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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; PreparedStatement   ancestorsSql = lr6Database.prepareStatement(getAncestorsSql);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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; Iterator&amp;lt;Long&amp;gt;   it = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;
  color:#7F0055;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;.&lt;/span&gt;&lt;span style="font-size:7.0pt;
  color:#0000C0;"&gt;root&lt;/span&gt;&lt;span style="font-size: 7pt; "&gt;.getGroupIds().iterator();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;while&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;(it.hasNext()){&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;long&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt; groupId =   it.next();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;long&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;   leftCategoryId = 1;&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ancestorsSql.clearParameters();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ancestorsSql.setLong(1,   groupId);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResultSet   catRes = ancestorsSql.executeQuery();&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size:7.0pt;color:#7F0055;"&gt;while&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 7pt; "&gt;(catRes.next()){&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentCategoryId   = catRes.getLong(1);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 7pt; "&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; leftCategoryId   = rebuildTree(leftCategoryId,groupId,parentCategoryId,lr6Database);&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 10pt; "&gt;}&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&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; }&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&lt;span style="font-size: 10pt; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;   &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;Questo metodo dovrebbe essere invocato al termine del popolamento delle tabelle assetvocabulary ed assetcategory.&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div style="margin-bottom: 0.0001pt; "&gt;A questo punto non ci resta solo che installare la portlet di categorizzazione.&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; "&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font size="6"&gt;Inserimento di entry nelle categorie di liferay&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Una volta costruito l&amp;rsquo;albero delle categorie lo step successivo è quello di inserire le relazioni tra le entità della nostra applicazione in liferay e le categorie presenti nell&amp;rsquo;albero di categorizzazione.&lt;/div&gt;  &lt;div&gt;Per fare questo è necessario fare differenti operazioni,che riassumiamo di seguito:&lt;/div&gt;  &lt;div&gt;-Inserire un riferimento alla nostra entità nella tabella assetentry&lt;/div&gt;  &lt;div&gt;-Inserire una relazione nella tabella assetentries_assetcategories che rappresenta l&amp;rsquo;associazione effettiva tra l&amp;rsquo;entity e la categoria stessa.&lt;/div&gt;  &lt;div&gt;Praticamente sono due query di insert:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;&lt;span style="font-size: smaller; "&gt;&lt;span style="line-height: 115%; color: rgb(42, 0, 255); "&gt;insert into assetentry (entryId,groupId,companyId,userId,username,createDate,modifiedDate,classPk,classnameid,visible) VALUES(?,?,?,0,'',Now(),Now(),?,?,true);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Unica accortezza qui è di inserire il &amp;lsquo;classnameid&amp;rsquo; ed il &amp;lsquo;classpk&amp;rsquo; ovvero l&amp;rsquo;id della classe che per la quale stiamo inserendo la entry,recuperabile dalla tabella &amp;lsquo;classname_&amp;rsquo; e la chiave primaria della stessa entità.&lt;/div&gt;  &lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;&lt;span style="font-size: smaller; "&gt;&lt;span style="line-height: 115%; color: rgb(42, 0, 255); "&gt;&amp;quot;insert into assetentries_assetcategories (entryId,categoryId) VALUES(?,?)&amp;quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;Anche qui nella prima query il campo &amp;ldquo;entryId&amp;rdquo; è gestito sempre prelevando dalla tabella counter il primo id disponibile,incrementandolo e alla fine aggiornando il valore della tabella counter.&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>Mon, 24 Sep 2012 09:13:31 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/creazione-albero-di-categorie-in-liferay</guid>
      <dc:creator>Aristide Cittadino</dc:creator>
      <dc:date>2012-09-24T09:13:31Z</dc:date>
    </item>
    <item>
      <title>Liferay e refresh della portlet al salvataggio delle impostazioni</title>
      <link>http://blog.d-vel.com/web/blog/home/-/blogs/liferay-e-refresh-della-portlet-al-salvataggio-delle-impostazioni</link>
      <description>&lt;p&gt;Nello sviluppo di una portlet custom potrebbe risultare necessario creare una pagina di configurazione in cui inserire vari parametri; le specifiche JSR prevedono una metodologia mentre Liferay ne prevede un'altra.&lt;/p&gt;&lt;p&gt;Non entro nel dettaglio di come creare una pagina di configurazione, ma sto facendo riferimento all'aggiunta dell'attributo &lt;code&gt;&amp;lt;configuration-action-class&amp;gt;&lt;/code&gt; all'interno del file &lt;em&gt;liferay-portlet.xml&lt;/em&gt; ed alla successiva implementazione della classe Java e della JSP.&lt;/p&gt;&lt;p&gt;Chi ha già provato questo sistema sa già che la pagina delle impostazioni della portlet viene visualizzata come popup modale; quello che voglio illustrare e come fare in modo che al submit della pagina di configurazione, oltre a salvare le impostazioni venga effettuato anche il refresh della portlet sottostante. In questo modo non è più necessario chiudere la popup modale e fare refresh a mano della pagina.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Come si procede? Molto semplice, basta aggiungere un apposito messaggio all'interno della classe &lt;em&gt;SessionMessages&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;PortletPreferences preferences = actionRequest.getPreferences();&lt;br /&gt;String portletResource = ParamUtil.getString(actionRequest, &amp;quot;portletResource&amp;quot;);&lt;br /&gt;if (Validator.isNotNull(portletResource)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; preferences = PortletPreferencesFactoryUtil&lt;br /&gt;                              .getPortletSetup(actionRequest, portletResource);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;[...ometto la parte di controllo dei valori inseriti in pagina...]&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;code&gt;preferences.store();&lt;br /&gt;SessionMessages.add(actionRequest,&lt;/code&gt; &lt;code&gt;portletConfig.getPortletName()&lt;br /&gt;                    + SessionMessages.KEY_SUFFIX_REFRESH_PORTLET,&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; portletResource);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;La &amp;quot;magia&amp;quot; viene fatta dall'aggiunta del &lt;em&gt;messaggio&lt;/em&gt; &lt;code&gt;KEY_SUFFIX_REFRESH_PORTLET&lt;/code&gt;, al resto penserà Liferay.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;</description>
      <pubDate>Wed, 19 Sep 2012 13:49:45 GMT</pubDate>
      <guid isPermaLink="false">http://blog.d-vel.com/web/blog/home/-/blogs/liferay-e-refresh-della-portlet-al-salvataggio-delle-impostazioni</guid>
      <dc:creator>Marco Napolitano</dc:creator>
      <dc:date>2012-09-19T13:49:45Z</dc:date>
    </item>
  </channel>
</rss>

