JBoss.orgCommunity Documentation
The UIActivityComposer is an extended class of UIContainer that is used to display inputs for users to create their own activities. To write your own activity composer, it is recommended that you use the UIActivityComposer available in Social.
For example, to create an input component for inserting video links into your activity, do the following steps:
1. Write UIVideoActivityComposer which extends UIActivityComposer. The UIActivityComposer allows you to input extended activities (for example, adding videos, links or documents) on the UI composer.
package org.exoplatform.social.plugin.videolink;
import org.exoplatform.social.plugin.videolink.util.VideoEmbedTool;
@ComponentConfig(
template = "classpath:groovy/social/plugin/videolink/UIVideoActivityComposer.gtmpl",
events = {
@EventConfig(listeners = UIVideoActivityComposer.SearchVideo.class),
@EventConfig(listeners = UIVideoActivityComposer.SelectVideoFromResultList.class),
@EventConfig(listeners = UIVideoActivityComposer.AttachActionListener.class),
@EventConfig(listeners = UIVideoActivityComposer.ChangeLinkContentActionListener.class),
@EventConfig(listeners = UIActivityComposer.CloseActionListener.class),
@EventConfig(listeners = UIActivityComposer.SubmitContentActionListener.class),
@EventConfig(listeners = UIActivityComposer.ActivateActionListener.class)
}
)
public class UIVideoActivityComposer extends UIActivityComposer {
public static final String LINK_PARAM = "link";
public static final String IMAGE_PARAM = "image";
public static final String TITLE_PARAM = "title";
public static final String HTML_PARAM = "htmlembed";
public static final String COMMENT_PARAM = "comment";
private static final String HTTP = "http://";
private static final String HTTPS = "https://";
private JSONObject videoJson;
private boolean linkInfoDisplayed_ = false;
private Map<String, String> templateParams;
/**
* The constructor.
*/
public UIVideoActivityComposer() {
setReadyForPostingActivity(false);
addChild(new UIFormStringInput("InputLink", "InputLink", null));
}
/**
* Set the link info to be displayed.
*
* @param displayed
*/
public void setLinkInfoDisplayed(boolean displayed) {
linkInfoDisplayed_ = displayed;
}
/**
* Set the template params.
*
* @param templateParams
*/
public void setTemplateParams(Map<String, String> templateParams) {
this.templateParams = templateParams;
}
/**
* Get the template params.
*/
public Map<String, String> getTemplateParams() {
return templateParams;
}
/**
* Clear the video json.
*/
public void clearVideoJson() {
videoJson = null;
}
/**
* Get the video json.
*/
public JSONObject getVideoJson() {
return videoJson;
}
/**
* Set the link.
* @param url
* @throws Exception
*/
private void setLink(String url) throws Exception {
if (!(url.contains(HTTP) || url.contains(HTTPS))) {
url = HTTP + url;
}
videoJson = VideoEmbedTool.getoembedData(url);
templateParams = new HashMap<String, String>();
templateParams.put(LINK_PARAM, url);
templateParams.put(TITLE_PARAM, videoJson.getString(VideoEmbedTool.OEMBED_TITLE));
templateParams.put(HTML_PARAM, videoJson.getString(VideoEmbedTool.OEMBED_HTML));
setLinkInfoDisplayed(true);
}
static public class AttachActionListener extends EventListener<UIVideoActivityComposer> {
@Override
public void execute(Event<UIVideoActivityComposer> event) throws Exception {
WebuiRequestContext requestContext = event.getRequestContext();
UIVideoActivityComposer uiComposerLinkExtension = event.getSource();
String url = requestContext.getRequestParameter(OBJECTID);
try {
uiComposerLinkExtension.setLink(url.trim());
} catch (Exception e) {
uiComposerLinkExtension.setReadyForPostingActivity(false);
return;
}
requestContext.addUIComponentToUpdateByAjax(uiComposerLinkExtension);
event.getSource().setReadyForPostingActivity(true);
}
}
static public class ChangeLinkContentActionListener extends EventListener<UIVideoActivityComposer> {
@Override
public void execute(Event<UIVideoActivityComposer> event) throws Exception {
WebuiRequestContext requestContext = event.getRequestContext();
UIVideoActivityComposer uiComposerLinkExtension = event.getSource();
Map<String, String> tempParams = new HashMap<String, String>();
uiComposerLinkExtension.setTemplateParams(tempParams);
requestContext.addUIComponentToUpdateByAjax(uiComposerLinkExtension);
UIComponent uiParent = uiComposerLinkExtension.getParent();
if (uiParent != null) {
uiParent.broadcast(event, event.getExecutionPhase());
}
}
}
public static class SelectVideoFromResultList extends EventListener<UIVideoActivityComposer>{
@Override
public void execute(Event<UIVideoActivityComposer> event) throws Exception {
WebuiRequestContext requestContext = event.getRequestContext();
UIVideoActivityComposer uiComposerLinkExtension = event.getSource();
}
}
public static class SearchVideo extends EventListener<UIVideoActivityComposer>{
@Override
public void execute(Event<UIVideoActivityComposer> event) throws Exception {
WebuiRequestContext requestContext = event.getRequestContext();
UIVideoActivityComposer uiComposerLinkExtension = event.getSource();
}
}
@Override
public void onPostActivity(PostContext postContext, UIComponent source,
WebuiRequestContext requestContext, String postedMessage) throws Exception {
templateParams.put(COMMENT_PARAM, postedMessage);
setTemplateParams(templateParams);
if (templateParams.size() == 0) {
uiApplication.addMessage(new ApplicationMessage("UIComposer.msg.error.Empty_Message",
null,
ApplicationMessage.WARNING));
return;
}
String title = "Shared a video: <a href={{{"}}}${" + LINK_PARAM + "}{{{"}}}>${" + TITLE_PARAM + "} </a>";
ExoSocialActivity activity = new ExoSocialActivityImpl(userIdentity.getId(),
UIVideoActivity.ACTIVITY_TYPE,
title,
null);
activity.setTemplateParams(templateParams);
if (postContext == UIComposer.PostContext.SPACE) {
UIActivitiesContainer activitiesContainer = uiDisplaySpaceActivities.getActivitiesLoader().getActivitiesContainer();
activitiesContainer.addActivity(activity);
requestContext.addUIComponentToUpdateByAjax(activitiesContainer);
requestContext.addUIComponentToUpdateByAjax(uiComposer);
} else if (postContext == PostContext.USER) {
UIUserActivitiesDisplay uiUserActivitiesDisplay = (UIUserActivitiesDisplay) getActivityDisplay();
String ownerName = uiUserActivitiesDisplay.getOwnerName();
Identity ownerIdentity = identityManager.getOrCreateIdentity(OrganizationIdentityProvider.NAME,
ownerName, false);
activityManager.saveActivity(ownerIdentity, activity);
if (uiUserActivitiesDisplay.getSelectedDisplayMode() == UIUserActivitiesDisplay.DisplayMode.MY_STATUS) {
UIActivitiesContainer activitiesContainer = uiUserActivitiesDisplay.getActivitiesLoader().getActivitiesContainer();
if (activitiesContainer.getChildren().size() == 1) {
uiUserActivitiesDisplay.setSelectedDisplayMode(UIUserActivitiesDisplay.DisplayMode.MY_STATUS);
} else {
activitiesContainer.addActivity(activity);
requestContext.addUIComponentToUpdateByAjax(activitiesContainer);
requestContext.addUIComponentToUpdateByAjax(uiComposer);
}
} else{
uiUserActivitiesDisplay.setSelectedDisplayMode(UIUserActivitiesDisplay.DisplayMode.MY_STATUS);
}
}
}
}
2. Use the BaseUIActivity class to write and customize the UIActivity display as below:
package org.exoplatform.social.plugin.videolink;
import org.exoplatform.social.webui.activity.BaseUIActivity;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.config.annotation.EventConfig;
@ComponentConfig(lifecycle = UIFormLifecycle.class, template = "classpath:groovy/social/plugin/videolink/UIVideoActivity.gtmpl", events = {
@EventConfig(listeners = BaseUIActivity.ToggleDisplayLikesActionListener.class),
@EventConfig(listeners = BaseUIActivity.ToggleDisplayCommentFormActionListener.class),
@EventConfig(listeners = BaseUIActivity.LikeActivityActionListener.class),
@EventConfig(listeners = BaseUIActivity.SetCommentListStatusActionListener.class),
@EventConfig(listeners = BaseUIActivity.PostCommentActionListener.class),
@EventConfig(listeners = BaseUIActivity.DeleteActivityActionListener.class, confirm = "UIActivity.msg.Are_You_Sure_To_Delete_This_Activity"),
@EventConfig(listeners = BaseUIActivity.DeleteCommentActionListener.class, confirm = "UIActivity.msg.Are_You_Sure_To_Delete_This_Comment")
}
)
public class UIVideoActivity extends BaseUIActivity {
public static final String ACTIVITY_TYPE = "VIDEO_ACTIVITY";
private String linkSource = "";
private String linkTitle = "";
private String linkHTML = "";
private String linkComment = "";
/**
* Get the link comment.
*/
public String getLinkComment() {
return linkComment;
}
/**
* Set the link comment.
*
* @param linkComment
*/
public void setLinkComment(String linkComment) {
this.linkComment = linkComment;
}
/**
* Get the link html.
*/
public String getLinkHTML() {
return linkHTML;
}
/**
* Set the link html.
*
* @param linkHTML
*/
public void setLinkHTML(String linkHTML) {
this.linkHTML = linkHTML;
}
/**
* Get the link source.
*/
public String getLinkSource() {
return linkSource;
}
/**
* Set the link source.
*
* @param linkSource
*/
public void setLinkSource(String linkSource) {
this.linkSource = linkSource;
}
/**
* Get the link title.
*/
public String getLinkTitle() {
return linkTitle;
}
/**
* Set the link title.
*
* @param linkTitle
*/
public void setLinkTitle(String linkTitle) {
this.linkTitle = linkTitle;
}
}
3. Use the UIVideoActivityBuilder class to get values of ExoSocialActivity that are set to UIVideoActivity for displaying.
package org.exoplatform.social.plugin.videolink;
import java.util.Map;
import org.exoplatform.social.core.activity.model.ExoSocialActivity;
public class UIVideoActivityBuilder extends BaseUIActivityBuilder {
private static final Log LOG = ExoLogger.getLogger(UIVideoActivityBuilder.class);
@Override
protected void extendUIActivity(BaseUIActivity uiActivity, ExoSocialActivity activity) {
UIVideoActivity uiVideoActivity = (UIVideoActivity) uiActivity;
Map<String, String> templateParams = activity.getTemplateParams();
uiVideoActivity.setLinkSource(templateParams.get(UIVideoActivityComposer.LINK_PARAM));
uiVideoActivity.setLinkTitle(templateParams.get(UIVideoActivityComposer.TITLE_PARAM));
uiVideoActivity.setLinkImage(templateParams.get(UIVideoActivityComposer.IMAGE_PARAM));
uiVideoActivity.setLinkHTML(templateParams.get(UIVideoActivityComposer.HTML_PARAM));
uiVideoActivity.setLinkComment(templateParams.get(UIVideoActivityComposer.COMMENT_PARAM));
}
}
You can check out the source code to get more details.