Liferay theme 上传logo分析

结论: 

theme上传logo会做以下事情:

(1)用UploadPortletRequest对象来处理页面的<input type=file>

(2)对于上传的logo图片为空,则抛出异常。

(3)对于上传的logo图片不为空,则先从数据库中找到当前layout,为logo定义logoId,并吧logoId添加到当前layout并存回数据库,然后根据布尔变量设定,来决定是否吧这个logo关联到hook,以及这个这个logo图片是否要持久化。

 

过程展示:

当在Liferay中的某个theme选择上传logo,并点击"save"按钮:

如下所示

 

具体分析:

它会去触发struts动作/group_pages/edit_layout_set,我们在struts-config.xml中找到匹配选项:

 
  
  1. <action path="/group_pages/edit_layout_set" type="com.liferay.portlet.layoutsadmin.action.EditLayoutSetAction"> 
  2.             <forward name="portlet.layouts_admin.edit_layouts" path="portlet.layouts_admin.edit_layouts" /> 
  3.             <forward name="portlet.layouts_admin.error" path="portlet.layouts_admin.error" /> 
  4.         </action> 

 

可以发现,它对应的动作类是EditLayoutSetAction类的updateLogo方法:

 
  
  1. protected void updateLogo( 
  2.             ActionRequest actionRequest, long liveGroupId, 
  3.             long stagingGroupId, boolean privateLayout, boolean hasLogo) 
  4.         throws Exception { 
  5.  
  6.         UploadPortletRequest uploadPortletRequest = 
  7.             PortalUtil.getUploadPortletRequest(actionRequest); 
  8.  
  9.         boolean useLogo = ParamUtil.getBoolean(actionRequest, "useLogo"); 
  10.  
  11.         InputStream inputStream = null
  12.  
  13.         try { 
  14.             File file = uploadPortletRequest.getFile("logoFileName"); 
  15.  
  16.             if (useLogo && !file.exists()) { 
  17.                 if (hasLogo) { 
  18.                     return
  19.                 } 
  20.  
  21.                 throw new UploadException("No logo uploaded for use"); 
  22.             } 
  23.  
  24.             if (file.exists()) { 
  25.                 inputStream = new ByteArrayFileInputStream(file, 1024); 
  26.             } 
  27.  
  28.             if (inputStream != null) { 
  29.                 inputStream.mark(0); 
  30.             } 
  31.  
  32.             LayoutSetServiceUtil.updateLogo( 
  33.                 liveGroupId, privateLayout, useLogo, inputStream, false); 
  34.  
  35.             if (inputStream != null) { 
  36.                 inputStream.reset(); 
  37.             } 
  38.  
  39.             if (stagingGroupId > 0) { 
  40.                 LayoutSetServiceUtil.updateLogo( 
  41.                     stagingGroupId, privateLayout, useLogo, inputStream, false); 
  42.             } 
  43.         } 
  44.         finally { 
  45.             StreamUtil.cleanUp(inputStream); 
  46.         } 
  47.     } 

 

这个方法我们仔细分析:

首先,在06行和14行定义了一个UploadPortletRequest对象,这个对象可以用来处理文件上传的操作,也就是从图示的文件上传控件中上传文件,因为上传文件的<input type="file",name="logoFileName",所以我们在14行uploadPortletRequest.getFile(fileName)就可以取得我们所上传的文件,也就是我们上传的图标。

然后第16-22行对于File对象为空进行了处理,这种情况下也就是没有上传任何文件就点了“save”,所以就会抛出没有logo的异常。

第24行,对于这个图标,我们打开一个字节文件输入流指向这个图标文件,然后调用32行的LayoutSetServiceUtil的updateLogo方法来更新图标,我们继续跟进:

可以发现它最终调用的是LayoutSetServiceImpl的updateLogo方法:

 
  
  1. public void updateLogo( 
  2.             long groupId, boolean privateLayout, boolean logo, 
  3.             InputStream inputStream, boolean cleanUpStream) 
  4.         throws PortalException, SystemException { 
  5.  
  6.         GroupPermissionUtil.check( 
  7.             getPermissionChecker(), groupId, ActionKeys.UPDATE); 
  8.  
  9.         layoutSetLocalService.updateLogo( 
  10.             groupId, privateLayout, logo, inputStream, cleanUpStream); 
  11.     } 

它先去检查这个update动作的permission,然后在去调用LayoutSetLocalService的updateLogo方法,其最终是调用LayoutSetLocalServiceImpl的updateLogo方法:

 
  
  1. public void updateLogo( 
  2.             long groupId, boolean privateLayout, boolean logo, InputStream is, 
  3.             boolean cleanUpStream) 
  4.         throws PortalException, SystemException { 
  5.  
  6.         LayoutSet layoutSet = layoutSetPersistence.findByG_P( 
  7.             groupId, privateLayout); 
  8.  
  9.         layoutSet.setModifiedDate(new Date()); 
  10.         layoutSet.setLogo(logo); 
  11.  
  12.         if (logo) { 
  13.             long logoId = layoutSet.getLogoId(); 
  14.  
  15.             if (logoId <= 0) { 
  16.                 logoId = counterLocalService.increment(); 
  17.  
  18.                 layoutSet.setLogoId(logoId); 
  19.             } 
  20.         } 
  21.  
  22.         layoutSetPersistence.update(layoutSet, false); 
  23.  
  24.         if (logo) { 
  25.             imageLocalService.updateImage( 
  26.                 layoutSet.getLogoId(), is, cleanUpStream); 
  27.         } 
  28.         else { 
  29.             imageLocalService.deleteImage(layoutSet.getLogoId()); 
  30.         } 
  31.     } 

 

从这里可以看出,它会先从数据库中读取当前LayoutSet,然后把logo的对应logoId添加到layoutSet中,然后把这个layoutSet写回数据库中。最后它根据bool变量logo ,来决定是否吧这个logo对应的Image写入数据库和绑定hook.





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/980604,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值