package sync;
import org.json.JSONObject;
import org.json.JSONArray;
import utils.JamConfig;
import utils.JamNetworkManager;
import utils.JamNetworkParam;
import utils.JamTokenManager;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.ArrayList;
import sync.JamSyncGroupMemberManager;
import sync.JamSyncGroupMemberManager.Member;
public class JamSyncGroupMembership extends JamSyncInterface {
static String API_ODATA_GET_GROUP_URL = "/api/v1/OData/Groups('%1$s')?$expand=Creator";
static String API_ODATA_GET_GROUP_FILTER_URL = "/api/v1/OData/Groups";
static String API_ODATA_POST_GROUPS_URL = "/api/v1/OData/Groups";
static String API_ODATA_POST_GROUP_JOIN_URL = "/api/v1/OData/Group_Join";
static String API_ODATA_POST_GROUP_INVITE_URL = "/api/v1/OData/Group_Invite";
static String API_ODATA_POST_GROUP_NOTIFICATION_URL = "/api/v1/OData/Notifications";
static String API_ODATA_POST_GROUP_NOTIFICATION_ACCEPT_URL = "/api/v1/OData/Notification_Accept";
static class Group {
public String uuid;
public String name;
public Boolean isActive;
public Boolean autoSubscribe;
public String groupType;
public String createdAt;
public String participation;
public Boolean moderationPolicy;
public Boolean autoGroup;
public Boolean disableAtNotify;
public Boolean contentsVisible;
public Boolean questionsVisible;
public Boolean ideasVisisble;
public Boolean discussionsVisible;
public Boolean tasksVisible;
public Boolean eventsVisible;
public Boolean linksVisible;
public Boolean subgroupsVisible;
public Boolean recommendationsVisible;
public Boolean hasOverview;
public String taskPolicy;
public Boolean isAdmin;
public String creatorEmail;
public String creatorUUID;
}
public JamSyncGroupMembership() {
}
// Retrieve group information from source instance and create same group to the destination instance
public Boolean syncGroupCreation(final String fromGroupUUID) {
try {
// [FROM INSTANCE] Get group info
final JamConfig.ConfigInfo fromConfig = JamConfig.getInstance().getFromConfig();
final String url = fromConfig.host + String.format(API_ODATA_GET_GROUP_URL, fromGroupUUID);
final JSONObject groupResponseJSON = JamNetworkManager.getInstance().GetRequest(url, new JamNetworkParam());
final JSONObject groupJson = ((JSONObject)groupResponseJSON.get("d")).getJSONObject("results");
System.out.println("\n Processing group from SOURCE instance: " + fromGroupUUID);
// Replicate group information to create new group for destination instance
final JSONObject groupParam = new JSONObject();
groupParam.put("Id", groupJson.getString("Id"));
groupParam.put("Name", groupJson.getString("Name") + "_Copy");
groupParam.put("IsActive", groupJson.getBoolean("IsActive"));
groupParam.put("AutoSubscribe", groupJson.getBoolean("AutoSubscribe"));
groupParam.put("GroupType", groupJson.getString("GroupType"));
groupParam.put("CreatedAt", groupJson.getString("CreatedAt"));
groupParam.put("Participation", groupJson.getString("Participation"));
groupParam.put("ModerationPolicy", groupJson.getBoolean("ModerationPolicy"));
groupParam.put("AutoGroup", groupJson.getBoolean("AutoGroup"));
groupParam.put("DisableAtNotify", groupJson.getBoolean("DisableAtNotify"));
groupParam.put("ContentsVisible", groupJson.getBoolean("ContentsVisible"));
groupParam.put("QuestionsVisible", groupJson.getBoolean("QuestionsVisible"));
groupParam.put("IdeasVisible", groupJson.getBoolean("IdeasVisible"));
groupParam.put("DiscussionsVisible", groupJson.getBoolean("DiscussionsVisible"));
groupParam.put("TasksVisible", groupJson.getBoolean("TasksVisible"));
groupParam.put("EventsVisible", groupJson.getBoolean("EventsVisible"));
groupParam.put("LinksVisible", groupJson.getBoolean("LinksVisible"));
groupParam.put("SubgroupsVisible", groupJson.getBoolean("SubgroupsVisible"));
groupParam.put("RecommendationsVisible", groupJson.getBoolean("RecommendationsVisible"));
groupParam.put("HasOverview", groupJson.getBoolean("HasOverview"));
groupParam.put("TaskPolicy", groupJson.getString("TaskPolicy"));
groupParam.put("IsAdmin", groupJson.getBoolean("IsAdmin"));
// Get creator so we can create the group using the same creator
final JamConfig.ConfigInfo toConfig = JamConfig.getInstance().getToConfig();
final JSONObject creatorJson = groupJson.getJSONObject("Creator");
final String creatorUUID = creatorJson.getString("Id");
final String creatorEmail = creatorJson.getString("Email");
String toGroupUUID = null;
// [TO INSTANCE] Create same group and replicate the same info
// Get Member token for same member on destination jam instance
JamTokenManager.getInstance().setTokenFromConfig(toConfig, creatorEmail);
System.out.println("\n");
// Build params to POST a group creation request for destination instance
JamNetworkParam params = new JamNetworkParam();
params.add("Content-Type", "application/json");
// Create create group post url
final String createGroupurl = toConfig.host + API_ODATA_POST_GROUPS_URL;
System.out.println(" Body: " + groupParam.toString());
// Post create group URL request
final InputStream inputStream = new ByteArrayInputStream(groupParam.toString().getBytes());
final JSONObject result = JamNetworkManager.getInstance().PostRequest(createGroupurl, params, inputStream);
final JSONObject createdGroupJson = ((JSONObject)result.get("d")).getJSONObject("results");
toGroupUUID = createdGroupJson.getString("Id");
// Set from and to group information
JamSyncGroupMemberManager.Group group = new JamSyncGroupMemberManager.Group();
group.name = groupParam.getString("Name");
group.fromUUID = fromGroupUUID;
group.toUUID = toGroupUUID;
group.creatorEmail = creatorEmail;
JamSyncGroupMemberManager.getInstance().SetGroupInfo(group);
// Invite all users to group
syncMembershipInviteAndAccept(fromGroupUUID, toGroupUUID, creatorEmail);
} catch (final Exception e) {
System.out.println("\n JamSyncGroupContents::SyncFromGroupInfo error: " + e.toString());
e.printStackTrace();
return false;
}
return true;
}
// For each user, send invite to join the designated group
public void syncMembershipInviteAndAccept(String fromGroupUUID, String toGroupUUID, String toGroupAdminEmail) throws Exception {
System.out.println(" Inviting members to destination group: " + toGroupUUID);
final JamConfig.ConfigInfo toConfig = JamConfig.getInstance().getToConfig();
final JamConfig.ConfigInfo fromConfig = JamConfig.getInstance().getFromConfig();
List<Member> memberList = JamSyncGroupMemberManager.getInstance().getAllMemberEmails(fromGroupUUID);
// Get Member token for same member on destination jam instance
JamTokenManager.getInstance().setTokenFromConfig(toConfig, toGroupAdminEmail);
for (Member member : memberList) {
member.toGroupUUID = toGroupUUID;
// Invite member to new group
System.out.println(" Invite member: " + member.email + " to destination group: " + toGroupUUID);
final String inviteUrl = toConfig.host + API_ODATA_POST_GROUP_INVITE_URL;
JamNetworkParam inviteParamBody = new JamNetworkParam();
JamNetworkParam inviteParamHeader = new JamNetworkParam();
inviteParamBody.add("Id", "'" + toGroupUUID + "'");
inviteParamBody.add("Email", "'" + member.email + "'");
inviteParamBody.add("Message", "'Invite to group!'");
final InputStream inviteInputStream = new ByteArrayInputStream(inviteParamBody.toString().getBytes());
JamNetworkManager.getInstance().PostRequest(inviteUrl, inviteParamHeader, inviteInputStream);
}
for (Member member : memberList) {
// Get Member token for same member on destination jam instance
JamTokenManager.getInstance().setTokenFromConfig(toConfig, member.email);
final String notificationsUrl = toConfig.host + API_ODATA_POST_GROUP_NOTIFICATION_URL;
JSONObject notificationResults = JamNetworkManager.getInstance().GetRequest(notificationsUrl, new JamNetworkParam());
final JSONArray notificationResult = ((JSONObject)notificationResults.get("d")).getJSONArray("results");
if (notificationResult.length() > 0) {
JSONObject event = notificationResult.getJSONObject(0);
String eventType = event.getString("EventType");
if (eventType.equals("InviteToGroup")) {
String notificationId = event.getString("Id");
final String notificationAcceptUrl = toConfig.host + API_ODATA_POST_GROUP_NOTIFICATION_ACCEPT_URL;
System.out.println("\n Invite Notitication ID : " + notificationId);
JamNetworkParam notificationAcceptParamBody = new JamNetworkParam();
JamNetworkParam notificationAcceptParamHeader = new JamNetworkParam();
notificationAcceptParamBody.add("Id", "'" + notificationId + "'");
InputStream inputStream1 = new ByteArrayInputStream(notificationAcceptParamBody.toString().getBytes());
JSONObject noticiationAcceptResults = JamNetworkManager.getInstance().PostRequest(notificationAcceptUrl,
notificationAcceptParamHeader,
inputStream1);
}
}
}
}
@Override
public void render() {
System.out.println("JamSyncGroupMemberShip::Render!");
}
@Override
public void sync(String fromGroupUUID) {
System.out.println("\n ##################################################################################################################################################");
System.out.println(" JamSyncGroupMemberShip::SYNC Begin!");
final JamConfig.ConfigInfo fromConfig = JamConfig.getInstance().getFromConfig();
// For each group, get list of member and add them to cache
Boolean passed = syncGroupCreation(fromGroupUUID);
System.out.println(" JamSyncGroupMemberShip::Sync end!");
System.out.println("\n ##################################################################################################################################################");
}
}