View Javadoc
1   /*
2    * Copyright (C) 2003-2010 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
16   */
17  package org.exoplatform.social.webui.activity;
18  
19  import java.util.Hashtable;
20  import java.util.Map;
21  
22  import javax.inject.Provider;
23  
24  import org.exoplatform.container.PortalContainer;
25  import org.exoplatform.container.component.BaseComponentPlugin;
26  import org.exoplatform.services.log.ExoLogger;
27  import org.exoplatform.services.log.Log;
28  import org.exoplatform.social.core.activity.model.ExoSocialActivity;
29  import org.exoplatform.webui.core.UIContainer;
30  import org.exoplatform.webui.ext.UIExtension;
31  import org.exoplatform.webui.ext.UIExtensionManager;
32  
33  /**
34   * UIActivityFactory.java
35   *
36   * @author    zun
37   * @since     Jul 22, 2010
38   */
39  public class UIActivityFactory extends BaseComponentPlugin {
40    
41    private static final Log LOG = ExoLogger.getLogger(UIActivityFactory.class);
42    
43    private Map<String, Provider<BaseUIActivityBuilder>> builders = new Hashtable<String, Provider<BaseUIActivityBuilder>>();
44    
45    private UIExtensionManager extensionManager;
46    
47    public UIActivityFactory() {
48      extensionManager = (UIExtensionManager) PortalContainer.getInstance().getComponentInstanceOfType(UIExtensionManager.class);
49    }
50  
51    /**
52     * Find BaseUIActivity which compatible with Activity's type, and then add UIComponent the parent UI.
53     * 
54     * @param activity
55     * @param parent
56     * @return
57     * @throws Exception
58     */
59    public BaseUIActivity addChild(ExoSocialActivity activity, UIContainer parent) throws Exception {
60      final String type = activity.getType();
61      final String externalId = activity.getExternalId();
62      if (type != null) {
63        return buildActivity(activity, parent, type);
64      } else if (externalId != null) {
65        // TODO Need to check if match the provided activity type or not
66        return buildActivity(activity, parent, externalId);
67      }
68      return buildActivity(activity, parent, UIDefaultActivity.ACTIVITY_TYPE);
69    }
70  
71    private BaseUIActivity buildActivity(ExoSocialActivity activity, UIContainer parent, String type) throws Exception {
72      
73      UIExtension activityExtension = extensionManager.getUIExtension(BaseUIActivity.class.getName(), type);
74      if (activityExtension == null) {
75        activityExtension = extensionManager.getUIExtension(BaseUIActivity.class.getName(), UIDefaultActivity.ACTIVITY_TYPE);
76      }
77      BaseUIActivity uiActivity = (BaseUIActivity) extensionManager.addUIExtension(activityExtension, null, parent);
78      uiActivity.setId(uiActivity.getId().replace(":","_") + "_" + uiActivity.hashCode());
79  
80      //populate data for this uiActivity
81      registerBuilder((UIActivityExtension) activityExtension);
82      BaseUIActivityBuilder builder = getBuilder(type);
83      return builder.populateData(uiActivity, activity);
84    }
85  
86    private BaseUIActivityBuilder getBuilder(String activityType) {
87      Provider<BaseUIActivityBuilder> providerBuilder = builders.get(activityType);
88      if(providerBuilder == null) {
89        providerBuilder = builders.get(UIDefaultActivity.ACTIVITY_TYPE);
90      }
91      return providerBuilder.get();
92    }
93  
94    private void registerBuilder(final UIActivityExtension activityExtension) throws Exception {
95      String activityType = activityExtension.getName();
96      if (builders.containsKey(activityType) == false) {
97        builders.put(activityType, new BuilderProvider<BaseUIActivityBuilder>(activityExtension));
98      }
99      
100   }
101   
102   /**
103    * Lazy creating the BaseUIActivityBuilder
104    * @author thanh_vucong
105    *
106    * @param <T>
107    */
108   static class BuilderProvider<T extends BaseUIActivityBuilder> implements Provider<T> {
109 
110     final UIActivityExtension activityExtension;
111     T instance = null;
112     public BuilderProvider(UIActivityExtension activityExtension) {
113       this.activityExtension = activityExtension;
114     }
115 
116     public T get() {
117       if (instance != null) {
118         return instance;
119       }
120       
121       try {
122         Class<T> builderClass = (Class<T>) Thread.currentThread().getContextClassLoader()
123                                             .loadClass(this.activityExtension.getActivityBuiderClass());
124         instance = (T) builderClass.newInstance();
125       } catch (Exception e) {
126         LOG.error(e);
127       }
128 
129       return instance;
130     }
131     
132   }
133 }