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,发现每个社交都对应一个,从大体上,大概分为博客 (Blog),消息板(Message Board),维基(Wiki).

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

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

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

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

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

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

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

       

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

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

       

      然后,它去解析元素,这个元素对应的值都可以在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.         } 

       

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

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

       

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

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

       

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

       

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