Liferay 启动过程分析8-初始化社交

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

 MainServlet在初始化布局模板之后,就开始初始化社交了,对应代码是:

 
 
  1. if (_log.isDebugEnabled()) { 
  2.             _log.debug("Initialize social"); 
  3.         } 
  4.  
  5.         try { 
  6.             initSocial(pluginPackage); 
  7.         } 
  8. .. 

 

它会去调用initSocial方法:

 
 
  1. protected void initSocial(PluginPackage pluginPackage) throws Exception { 
  2.         ClassLoader classLoader = PortalClassLoaderUtil.getClassLoader(); 
  3.  
  4.         ServletContext servletContext = getServletContext(); 
  5.  
  6.         String[] xmls = new String[] { 
  7.             HttpUtil.URLtoString( 
  8.                 servletContext.getResource("/WEB-INF/liferay-social.xml")), 
  9.             HttpUtil.URLtoString( 
  10.                 servletContext.getResource("/WEB-INF/liferay-social-ext.xml")) 
  11.         }; 
  12.  
  13.         SocialConfigurationUtil.read(classLoader, xmls); 
  14.     } 

 

我们看出来,它还是先取得servletContext(04行),然后读取2个和social相关的xml配置文件,关于Liferay的社交概念,我自从上个月学习Liferay以来一直不明确,今天刚好看了下liferay-social.xml,发现每个社交都对应一个<activity>,从大体上,大概分为博客 (Blog),消息板(Message Board),维基(Wiki).

然后,它会去调用SocialConfigurationUtil类的read方法来分析这些Social相关的配置文件:

 
 
  1. public static List<Object> read(ClassLoader classLoader, String[] xmls) 
  2.         throws Exception { 
  3.  
  4.         List<Object> objects = new ArrayList<Object>(); 
  5.  
  6.         for (String xml : xmls) { 
  7.             _read(classLoader, xml, objects); 
  8.         } 
  9.  
  10.         return objects; 
  11.     } 

 

它遍历xml配置文件,并且对于每个xml文件,调用私有的_read方法:

 
 
  1. private static void _read( 
  2.             ClassLoader classLoader, String xml, List<Object> objects) 
  3.         throws Exception { 
  4.  ..
  5.  
  6.         List<Element> activityElements = rootElement.elements("activity"); 
  7.  
  8.         for (Element activityElement : activityElements) { 
  9.             _readActivity(classLoader, objects, activityElement); 
  10.         } 
  11.     } 

 

正如我所料,它回去读取每个xml元素的<activity>元素,然后调用私有的方法_readActivity()来进行读取。被读取的<activity>元素我们可以参照下面这个:

 
 
  1. <activity> 
  2.         <model-name>com.liferay.portlet.wiki.model.WikiPage</model-name> 
  3.         <activity-type>${com.liferay.portlet.wiki.social.WikiActivityKeys.UPDATE_PAGE}</activity-type> 
  4.         <language-key>UPDATE_PAGE</language-key> 
  5.         <log-activity>true</log-activity> 
  6.         <participation-value>1</participation-value> 
  7.         <participation-limit period="period">10</participation-limit> 
  8.         <counter> 
  9.             <name>user.wiki-updates</name> 
  10.             <owner-type>actor</owner-type> 
  11.         </counter> 
  12.     </activity> 

我们现在具体分析_readActivity()方法是如何具体来解析这段<activity>元素的。

 

首先,它去解析<model-name>元素,并且获取匹配的SocialActivityDefinition对象,如果没有则创建:

 
 
  1. String modelName = GetterUtil.getString( 
  2.             activityElement.elementText("model-name")); 
  3.  
  4.         Map<Integer, SocialActivityDefinition> activityDefinitions = 
  5.             _activityDefinitions.get(modelName); 
  6.  
  7.         if (activityDefinitions == null) { 
  8.             activityDefinitions = 
  9.                 new HashMap<Integer, SocialActivityDefinition>(); 
  10.  
  11.             _activityDefinitions.put(modelName, activityDefinitions); 
  12.         } 

 

然后,它去解析<activity-type>元素,这个元素对应的值都可以在codebase中找到,是个整数,然后搜索是否有匹配的SocialActivityDefinition对象,如果没有则创建:

 
 
  1.         int activityType = GetterUtil.getInteger( 
  2.             activityElement.elementText("activity-type")); 
  3.  
  4.         SocialActivityDefinition activityDefinition = activityDefinitions.get( 
  5.             activityType); 
  6.  
  7.         if (activityDefinition == null) { 
  8.             activityDefinition = new SocialActivityDefinition(); 
  9.  
  10. ... 
  11.             objects.add(activityDefinition); 
  12.         } 

 

然后,它去解析<counter>元素,一个activity可以有多个counter元素:

 
 
  1. List<Element> counterElements = activityElement.elements("counter"); 
  2.  
  3.         for (Element counterElement : counterElements) { 
  4.             _readCounter(objects, activityDefinition, counterElement); 
  5.         } 

 

最后,它去解析<achievement>元素,一个activity可以有多个achievement元素:

 
 
  1. List<Element> achievementElements = activityElement.elements( 
  2.             "achievement"); 
  3.  
  4.         for (Element achievementElement : achievementElements) { 
  5.             _readAchievement( 
  6.                 classLoader, objects, activityDefinition, achievementElement); 
  7.         } 

 

等这些元素都解析完,则所有social相关的信息都是可用的了。





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

目录
相关文章
|
2月前
|
人工智能 前端开发 Java
【Tomcat源码分析】启动过程深度解析 (二)
本文深入探讨了Tomcat启动Web应用的过程,重点解析了其加载ServletContextListener及Servlet的机制。文章从Bootstrap反射调用Catalina的start方法开始,逐步介绍了StandardServer、StandardService、StandardEngine、StandardHost、StandardContext和StandardWrapper的启动流程。每个组件通过Lifecycle接口协调启动,子容器逐层启动,直至整个服务器完全启动。此外,还详细分析了Pipeline及其Valve组件的作用,展示了Tomcat内部组件间的协作机制。
【Tomcat源码分析】启动过程深度解析 (二)
|
2月前
|
设计模式 人工智能 安全
【Tomcat源码分析】生命周期机制 Lifecycle
Tomcat内部通过各种组件协同工作,构建了一个复杂的Web服务器架构。其中,`Lifecycle`机制作为核心,管理组件从创建到销毁的整个生命周期。本文详细解析了Lifecycle的工作原理及其方法,如初始化、启动、停止和销毁等关键步骤,并展示了LifecycleBase类如何通过状态机和模板模式实现这一过程。通过深入理解Lifecycle,我们可以更好地掌握组件生命周期管理,提升系统设计能力。欢迎关注【码上遇见你】获取更多信息,或搜索【AI贝塔】体验免费的Chat GPT。希望本章内容对你有所帮助。
|
SQL 人工智能 移动开发
Android应用启动流程:从启动到可交互的过程解析
Android应用启动流程:从启动到可交互的过程解析
|
监控 安全 Java
《SpringBoot启动流程三》:两万+字图文带你debug源码分析SpringApplication准备阶段(含配置文件加载时机、日志系统初始化时机)
《SpringBoot启动流程三》:两万+字图文带你debug源码分析SpringApplication准备阶段(含配置文件加载时机、日志系统初始化时机)
320 0
《SpringBoot启动流程三》:两万+字图文带你debug源码分析SpringApplication准备阶段(含配置文件加载时机、日志系统初始化时机)
|
Java Android开发
Android源码分析--应用程序启动
Android源码分析--应用程序启动
182 0
Android源码分析--应用程序启动