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

 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相关的信息都是可用的了。

 

你可能感兴趣的:(Liferay启动过程分析)