package com.easemob.server.example.jersey.apidemo; import java.util.ArrayList; import java.util.List; import com.easemob.server.example.jersey.vo.ClientSecretCredential; import org.apache.commons.lang3.StringUtils; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.glassfish.jersey.client.JerseyWebTarget; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.easemob.server.example.comm.Constants; import com.easemob.server.example.comm.HTTPMethod; import com.easemob.server.example.comm.Roles; import com.easemob.server.example.jersey.utils.JerseyUtils; import com.easemob.server.example.jersey.vo.Credential; import com.easemob.server.example.jersey.vo.EndPoints; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; /** * REST API Demo : 用户体系集成 Jersey2.9实现 * * Doc URL: http://www.easemob.com/docs/rest/userapi/ * * @author Lynch 2014-09-09 * */ public class EasemobIMUsers { private static final Logger LOGGER = LoggerFactory.getLogger(EasemobIMUsers.class); private static final String APPKEY = Constants.APPKEY; private static final JsonNodeFactory factory = new JsonNodeFactory(false); // 通过app的client_id和client_secret来获取app管理员token private static Credential credential = new ClientSecretCredential(Constants.APP_CLIENT_ID, Constants.APP_CLIENT_SECRET, Roles.USER_ROLE_APPADMIN); public static void main(String[] args) { /** * 注册IM用户[单个] */ ObjectNode datanode = JsonNodeFactory.instance.objectNode(); datanode.put("username","kenshinnuser100"); datanode.put("password", Constants.DEFAULT_PASSWORD); ObjectNode createNewIMUserSingleNode = createNewIMUserSingle(datanode); if (null != createNewIMUserSingleNode) { LOGGER.info("注册IM用户[单个]: " + createNewIMUserSingleNode.toString()); } /** * IM用户登录 */ ObjectNode imUserLoginNode = imUserLogin(datanode.get("username").asText(), datanode.get("password").asText()); if (null != imUserLoginNode) { LOGGER.info("IM用户登录: " + imUserLoginNode.toString()); } /** * 注册IM用户[批量生成用户然后注册] */ String usernamePrefix = "kenshinnuser"; Long perNumber = 10l; Long totalNumber = 100l; ObjectNode createNewIMUserBatchGenNode = createNewIMUserBatchGen(usernamePrefix, perNumber, totalNumber); if (null != createNewIMUserBatchGenNode) { LOGGER.info("注册IM用户[批量]: " + createNewIMUserBatchGenNode.toString()); } /** * 获取IM用户[主键查询] */ String userName = "kenshinnuser100"; ObjectNode getIMUsersByUserNameNode = getIMUsersByUserName(userName); if (null != getIMUsersByUserNameNode) { LOGGER.info("获取IM用户[主键查询]: " + getIMUsersByUserNameNode.toString()); } /** * 重置IM用户密码 提供管理员token */ String username = "kenshinnuser100"; ObjectNode json2 = JsonNodeFactory.instance.objectNode(); json2.put("newpassword", Constants.DEFAULT_PASSWORD); ObjectNode modifyIMUserPasswordWithAdminTokenNode = modifyIMUserPasswordWithAdminToken(username, json2); if (null != modifyIMUserPasswordWithAdminTokenNode) { LOGGER.info("重置IM用户密码 提供管理员token: " + modifyIMUserPasswordWithAdminTokenNode.toString()); } ObjectNode imUserLoginNode2 = imUserLogin(username, json2.get("newpassword").asText()); if (null != imUserLoginNode2) { LOGGER.info("重置IM用户密码后,IM用户登录: " + imUserLoginNode2.toString()); } /** * 添加好友[单个] */ String ownerUserName = username; String friendUserName = "kenshinnuser099"; ObjectNode addFriendSingleNode = addFriendSingle(ownerUserName, friendUserName); if (null != addFriendSingleNode) { LOGGER.info("添加好友[单个]: " + addFriendSingleNode.toString()); } /** * 查看好友 */ ObjectNode getFriendsNode = getFriends(ownerUserName); if (null != getFriendsNode) { LOGGER.info("查看好友: " + getFriendsNode.toString()); } /** * 解除好友关系 **/ ObjectNode deleteFriendSingleNode = deleteFriendSingle(ownerUserName, friendUserName); if (null != deleteFriendSingleNode) { LOGGER.info("解除好友关系: " + deleteFriendSingleNode.toString()); } /** * 删除IM用户[单个] */ ObjectNode deleteIMUserByUserNameNode = deleteIMUserByUserName(userName); if (null != deleteIMUserByUserNameNode) { LOGGER.info("删除IM用户[单个]: " + deleteIMUserByUserNameNode.toString()); } /** * 删除IM用户[批量] */ Long limit = 2l; ObjectNode deleteIMUserByUsernameBatchNode = deleteIMUserByUsernameBatch(limit, null); if (null != deleteIMUserByUsernameBatchNode) { LOGGER.info("删除IM用户[批量]: " + deleteIMUserByUsernameBatchNode.toString()); } } /** * 注册IM用户[单个] * * 给指定AppKey创建一个新的用户 * * @param dataNode * @return */ public static ObjectNode createNewIMUserSingle(ObjectNode dataNode) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } objectNode.removeAll(); // check properties that must be provided if (null != dataNode && !dataNode.has("username")) { LOGGER.error("Property that named username must be provided ."); objectNode.put("message", "Property that named username must be provided ."); return objectNode; } if (null != dataNode && !dataNode.has("password")) { LOGGER.error("Property that named password must be provided ."); objectNode.put("message", "Property that named password must be provided ."); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_TARGET.resolveTemplate("org_name", APPKEY.split("#")[0]).resolveTemplate("app_name", APPKEY.split("#")[1]); objectNode = JerseyUtils.sendRequest(webTarget, dataNode, credential, HTTPMethod.METHOD_POST, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 注册IM用户[批量] * * 给指定AppKey创建一批用户 * * @param dataArrayNode * @return */ public static ObjectNode createNewIMUserBatch(ArrayNode dataArrayNode) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } // check properties that must be provided if (dataArrayNode.isArray()) { for (JsonNode jsonNode : dataArrayNode) { if (null != jsonNode && !jsonNode.has("username")) { LOGGER.error("Property that named username must be provided ."); objectNode.put("message", "Property that named username must be provided ."); return objectNode; } if (null != jsonNode && !jsonNode.has("password")) { LOGGER.error("Property that named password must be provided ."); objectNode.put("message", "Property that named password must be provided ."); return objectNode; } } } try { JerseyWebTarget webTarget = EndPoints.USERS_TARGET.resolveTemplate("org_name", APPKEY.split("#")[0]).resolveTemplate("app_name", APPKEY.split("#")[1]); objectNode = JerseyUtils.sendRequest(webTarget, dataArrayNode, credential, HTTPMethod.METHOD_POST, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 注册IM用户[批量生成用户然后注册] * * 给指定AppKey创建一批用户 * * @param usernamePrefix * 生成用户名的前缀 * @param perNumber * 批量注册时一次注册的数量 * @param totalNumber * 生成用户注册的用户总数 * @return */ public static ObjectNode createNewIMUserBatchGen(String usernamePrefix, Long perNumber, Long totalNumber) { ObjectNode objectNode = factory.objectNode(); if (totalNumber == 0 || perNumber == 0) { return objectNode; } System.out.println("你即将注册" + totalNumber + "个用户,如果大于" + perNumber + "了,会分批注册,每次注册" + perNumber + "个"); ArrayNode genericArrayNode = EasemobIMUsers.genericArrayNode( usernamePrefix, totalNumber); if (totalNumber <= perNumber) { objectNode = EasemobIMUsers.createNewIMUserBatch(genericArrayNode); } else { for (int i = 0; i < genericArrayNode.size(); i++) { ArrayNode tmpArrayNode = factory.arrayNode(); tmpArrayNode.add(genericArrayNode.get(i)); // 300 records on one migration if ((i + 1) % perNumber == 0) { objectNode = EasemobIMUsers .createNewIMUserBatch(genericArrayNode); tmpArrayNode.removeAll(); continue; } // the rest records that less than the times of 300 if (i > (genericArrayNode.size() / perNumber * perNumber - 1)) { objectNode = EasemobIMUsers .createNewIMUserBatch(genericArrayNode); tmpArrayNode.removeAll(); } } } return objectNode; } /** * 获取IM用户 * * @param userName * 用户主键:username或者uuid * @return */ public static ObjectNode getIMUsersByUserName(String userName) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } // check properties that must be provided if (StringUtils.isEmpty(userName)) { LOGGER.error("The primaryKey that will be useed to query must be provided ."); objectNode .put("message", "The primaryKey that will be useed to query must be provided ."); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .path(userName); objectNode = JerseyUtils.sendRequest(webTarget, null, credential, HTTPMethod.METHOD_GET, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 删除IM用户[单个] * * 删除指定AppKey下IM单个用户 * * * @param userName * @return */ public static ObjectNode deleteIMUserByUserName(String userName) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .path(userName); objectNode = JerseyUtils.sendRequest(webTarget, null, credential, HTTPMethod.METHOD_DELETE, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 删除IM用户[批量] * * 批量指定AppKey下删除IM用户 * * @param limit * @param queryStr * @return */ public static ObjectNode deleteIMUserByUsernameBatch(Long limit, String queryStr) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .queryParam("ql", queryStr) .queryParam("limit", String.valueOf(limit)); objectNode = JerseyUtils.sendRequest(webTarget, null, credential, HTTPMethod.METHOD_DELETE, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 重置IM用户密码 提供管理员token * * @param userName * @param dataObjectNode * @return */ public static ObjectNode modifyIMUserPasswordWithAdminToken( String userName, ObjectNode dataObjectNode) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } if (StringUtils.isEmpty(userName)) { LOGGER.error("Property that named userName must be provided,the value is username or uuid of imuser."); objectNode .put("message", "Property that named userName must be provided,the value is username or uuid of imuser."); return objectNode; } if (null != dataObjectNode && !dataObjectNode.has("newpassword")) { LOGGER.error("Property that named newpassword must be provided ."); objectNode.put("message", "Property that named newpassword must be provided ."); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .path(userName).path("password"); objectNode = JerseyUtils.sendRequest(webTarget, dataObjectNode, credential, HTTPMethod.METHOD_PUT, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 添加好友[单个] * * @param ownerUserName * @param friendUserName * * @return */ public static ObjectNode addFriendSingle(String ownerUserName, String friendUserName) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username or uuid of imuser."); objectNode .put("message", "Your userName must be provided,the value is username or uuid of imuser."); return objectNode; } if (StringUtils.isEmpty(friendUserName)) { LOGGER.error("The userName of friend must be provided,the value is username or uuid of imuser."); objectNode .put("message", "The userName of friend must be provided,the value is username or uuid of imuser."); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_ADDFRIENDS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .resolveTemplate("ownerUserName", ownerUserName) .resolveTemplate("friendUserName", friendUserName); ObjectNode body = factory.objectNode(); objectNode = JerseyUtils.sendRequest(webTarget, body, credential, HTTPMethod.METHOD_POST, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 解除好友关系 * * @param ownerUserName * @param friendUserName * * @return */ public static ObjectNode deleteFriendSingle(String ownerUserName, String friendUserName) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username or uuid of imuser."); objectNode.put("message", "Your userName must be provided,the value is username or uuid of imuser."); return objectNode; } if (StringUtils.isEmpty(friendUserName)) { LOGGER.error("The userName of friend must be provided,the value is username or uuid of imuser."); objectNode .put("message", "The userName of friend must be provided,the value is username or uuid of imuser."); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_ADDFRIENDS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .resolveTemplate("ownerUserName", ownerUserName) .resolveTemplate("friendUserName", friendUserName); ObjectNode body = factory.objectNode(); objectNode = JerseyUtils.sendRequest(webTarget, body, credential, HTTPMethod.METHOD_DELETE, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * 查看好友 * * @param ownerUserName * * @return */ public static ObjectNode getFriends(String ownerUserName) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username or uuid of imuser."); objectNode.put("message", "Your userName must be provided,the value is username or uuid of imuser."); return objectNode; } try { JerseyWebTarget webTarget = EndPoints.USERS_ADDFRIENDS_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]) .resolveTemplate("ownerUserName", ownerUserName) .resolveTemplate("friendUserName", ""); ObjectNode body = factory.objectNode(); objectNode = JerseyUtils.sendRequest(webTarget, body, credential, HTTPMethod.METHOD_GET, null); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * IM用户登录 * * @param ownerUserName * @param password * * @return */ public static ObjectNode imUserLogin(String ownerUserName, String password) { ObjectNode objectNode = factory.objectNode(); // check appKey format if (!JerseyUtils.match("^(?!-)[0-9a-zA-Z\\-]+#[0-9a-zA-Z]+", APPKEY)) { LOGGER.error("Bad format of Appkey: " + APPKEY); objectNode.put("message", "Bad format of Appkey"); return objectNode; } if (StringUtils.isEmpty(ownerUserName)) { LOGGER.error("Your userName must be provided,the value is username or uuid of imuser."); objectNode.put("message", "Your userName must be provided,the value is username or uuid of imuser."); return objectNode; } if (StringUtils.isEmpty(password)) { LOGGER.error("Your password must be provided,the value is username or uuid of imuser."); objectNode.put("message", "Your password must be provided,the value is username or uuid of imuser."); return objectNode; } try { ObjectNode dataNode = factory.objectNode(); dataNode.put("grant_type", "password"); dataNode.put("username", ownerUserName); dataNode.put("password", password); List<NameValuePair> headers = new ArrayList<NameValuePair>(); headers.add(new BasicNameValuePair("Content-Type", "application/json")); objectNode = JerseyUtils.sendRequest(EndPoints.TOKEN_APP_TARGET .resolveTemplate("org_name", APPKEY.split("#")[0]) .resolveTemplate("app_name", APPKEY.split("#")[1]), dataNode, null, HTTPMethod.METHOD_POST, headers); } catch (Exception e) { throw new RuntimeException( "Some errors ocuured while fetching a token by usename and passowrd ."); } return objectNode; } /** * 指定前缀和数量生成用户基本数据 * * @param usernamePrefix * @param number * @return */ private static ArrayNode genericArrayNode(String usernamePrefix, Long number) { ArrayNode arrayNode = factory.arrayNode(); for (int i = 0; i < number; i++) { ObjectNode userNode = factory.objectNode(); userNode.put("username", usernamePrefix + "_" + i); userNode.put("password", Constants.DEFAULT_PASSWORD); arrayNode.add(userNode); } return arrayNode; } }