1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
35
36
37
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
53
54
55
56
57
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
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
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
104
105
106
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 }