View Javadoc
1   package org.exoplatform.wcm.addons.rdbms.listener;
2   
3   import javax.jcr.Node;
4   import javax.jcr.RepositoryException;
5   import javax.jcr.Session;
6   
7   import org.exoplatform.commons.utils.ActivityTypeUtils;
8   import org.exoplatform.commons.utils.CommonsUtils;
9   import org.exoplatform.services.listener.Event;
10  import org.exoplatform.services.listener.Listener;
11  import org.exoplatform.services.log.ExoLogger;
12  import org.exoplatform.services.log.Log;
13  import org.exoplatform.social.core.activity.model.ExoSocialActivity;
14  import org.exoplatform.social.plugin.doc.UIDocActivity;
15  import org.exoplatform.wcm.ext.component.activity.UILinkActivity;
16  import org.exoplatform.wcm.ext.component.activity.listener.Utils;
17  
18  public class WCMActivityUpdaterListener extends Listener<ExoSocialActivity, String> {
19    private static final Log LOG = ExoLogger.getLogger(WCMActivityUpdaterListener.class);
20  
21    public WCMActivityUpdaterListener() {
22    }
23  
24    @Override
25    public void onEvent(Event<ExoSocialActivity, String> event) throws Exception {
26      ExoSocialActivity oldActivity = event.getSource();
27      String type = (oldActivity.getType() == null) ? "" : oldActivity.getType();
28      switch (type) {
29      case UILinkActivity.ACTIVITY_TYPE:
30        migrationLinkActivity(oldActivity, event.getData());
31        break;
32      case Utils.CONTENT_SPACES:
33        migrationContentSpaceActivity(oldActivity, event.getData());
34        break;
35      case Utils.FILE_SPACES:
36        migrationFileSpaceActivity(oldActivity, event.getData());
37        break;
38      default:
39        break;
40      }
41    }
42  
43    private void migrationLinkActivity(ExoSocialActivity oldActivity, String newId) {
44    }
45  
46    private void migrationContentSpaceActivity(ExoSocialActivity oldActivity, String newId) {
47    }
48  
49    private void migrationFileSpaceActivity(ExoSocialActivity activity, String newId) throws RepositoryException {
50      if (activity.isComment()) {
51        // TODO: Needs to confirm with ECMS team about the comment type
52        // Utils.CONTENT_SPACES = "contents:spaces" Asks ECMS team to update the comment
53        // There is new mixin type define to keep the CommentId
54        // private static String MIX_COMMENT = "exo:activityComment";
55        // private static String MIX_COMMENT_ID = "exo:activityCommentID";
56        LOG.info(String.format("Migration file-spaces comment '%s' with new id's %s", activity.getTitle(), newId));
57        //
58        migrationDoc(activity, newId);
59      } else {
60        LOG.info(String.format("Migration file-spaces activity '%s' with new id's %s", activity.getTitle(), newId));
61        //
62        migrationDoc(activity, newId);
63      }
64    }
65  
66    private void migrationDoc(ExoSocialActivity activity, String newId) throws RepositoryException {
67      String workspace = activity.getTemplateParams().get(UIDocActivity.WORKSPACE);
68      if(workspace == null) {
69        workspace = activity.getTemplateParams().get(UIDocActivity.WORKSPACE.toLowerCase());
70      }
71      String docId = activity.getTemplateParams().get(UIDocActivity.ID);
72      Node docNode = getDocNode(workspace, activity.getUrl(), docId);
73      if (docNode != null && docNode.isNodeType(ActivityTypeUtils.EXO_ACTIVITY_INFO)) {
74        LOG.info("Migration doc: " + docNode.getPath());
75        try {
76          ActivityTypeUtils.attachActivityId(docNode, newId);
77          docNode.getSession().save();
78        } catch (RepositoryException e) {
79          LOG.warn("Updates the file-spaces activity is unsuccessful!");
80          LOG.debug("Updates the file-spaces activity is unsuccessful!", e);
81        }
82      } else {
83        LOG.info(String.format("Missing document's path/Id on template-parameters. Do not migrate this file-spaces activity width old id %s - new id %s" , activity.getId(), newId));
84      }
85    }
86  
87    /**
88     * This method is target to get the Document node.
89     * 
90     * @param workspace
91     * @param path
92     * @param nodeId
93     * @return
94     */
95    private Node getDocNode(String workspace, String path, String nodeId) {
96      if (workspace == null || (nodeId == null && path == null)) {
97        return null;
98      }
99      try {
100       Session session = CommonsUtils.getSystemSessionProvider().getSession(workspace, CommonsUtils.getRepository());
101       try {
102         return session.getNodeByUUID(nodeId);
103       } catch (Exception e) {
104         return (Node) session.getItem(path);
105       }
106     } catch (RepositoryException e) {
107       return null;
108     }
109   }
110 }