public class Client {
	private String appKey;	//APP_KEY
	private String appSecret;	//APP_SECREET
	
	public Client(String appKey, String appSecret) {
		if(StringUtil.isEmpty(appKey) || StringUtil.isEmpty(appSecret)) {
			throw new IllegalArgumentException("APP_KEY and APP_Secret must be not null.");
		}
		this.appKey = appKey;
		this.appSecret = appSecret;
	}
	
	public String getAppKey() {
		return appKey;
	}
	public void setAppKey(String appKey) {
		this.appKey = appKey;
	}
	public String getAppSecret() {
		return appSecret;
	}
	public void setAppSecret(String appSecret) {
		this.appSecret = appSecret;
	}
	@Override
	public String toString() {
		return "Client [appKey=" + appKey + ", appSecret=" + appSecret + "]";
	}
} public class RespConfig {

	public final static int RESP_OK = 0;
	
	public final static int FACESET_MAX_FACE = 10000;
	
} public class UrlConfig {
	
	public static final String CHART_SET = "UTF-8";

	public static final String BASE_URL = "https://apicn.faceplusplus.com/v2";
	
	//Face
	public static final String PATH_DETECT = "/detection/detect";
	
	//Person
	public static final String PATH_PERSON_CREATE = "/person/create";
	
	public static final String PATH_PERSON_DELETE = "/person/delete";
	
	public static final String PATH_PERSON_ADD_FACE = "/person/add_face";
	
	public static final String PATH_PERSON_REMOVE_FACE = "/person/remove_face";
	
	public static final String PATH_PERSON_SET_INFO = "/person/set_info";
	
	public static final String PATH_PERSON_GET_INFO = "/person/get_info";
	
	//Group
	public static final String PATH_GROUP_CREATE = "/group/create";
	
	public static final String PATH_GROUP_DELETE = "/group/delete";
	
	public static final String PATH_GROUP_ADD_PERSON = "/group/add_person";
	
	public static final String PATH_GROUP_REMOVE_PERSON = "/group/remove_person";
	
	public static final String PATH_GROUP_SET_INFO = "/group/set_info";
	
	public static final String PATH_GROUP_GET_INFO = "/group/get_info";
	
	//Faceset
	public static final String PATH_FACESET_CREATE = "/faceset/create";

	public static final String PATH_FACESET_DELETE = "/faceset/delete";
	
	public static final String PATH_FACESET_ADD_FACE = "/faceset/add_face";
	
	public static final String PATH_FACESET_REMOVE_FACE = "/faceset/remove_face";
	
	public static final String PATH_FACESET_SET_INFO = "/faceset/set_info";
	
	public static final String PATH_FACESET_GET_INFO = "/faceset/get_info";

	//Grouping
	public static final String PATH_GROUPING = "/grouping/grouping";
	
	//Info
	public static final String PATH_INFO_GET_IMAGE = "/info/get_image";
	
	public static final String PATH_INFO_GET_FACE = "/info/get_face";
	
	public static final String PATH_INFO_GET_PERSON_LIST = "/info/get_person_list";
	
	public static final String PATH_INFO_GET_FACESET_LIST = "/info/get_faceset_list";
	
	public static final String PATH_INFO_GET_GROUP_LIST = "/info/get_group_list";
	
	public static final String PATH_INFO_GET_SESSION = "/info/get_session";
	
	public static final String PATH_INFO_GET_QUOTA = "/info/get_quota";
	
	public static final String PATH_INFO_GET_APP = "/info/get_app";
	
	//train
	public static final String PATH_TRAIN_VERIFY = "/train/verify";

	public static final String PATH_TRAIN_SEARCH = "/train/search";
	
	public static final String PATH_TRAIN_IDENTIFY = "/train/identify";
	
	//recognition
	public static final String PATH_RECOGNITION_COMPARE = "/recognition/compare";
	
	public static final String PATH_RECOGNITION_VERIFY = "/recognition/verify";
	
	public static final String PATH_RECOGNITION_SEARCH = "/recognition/search";
	
	public static final String PATH_RECOGNITION_IDENTIFY = "/recognition/identify";
	
} public class Face implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8603825983713166688L;
	// face array 被检测出的人脸的列表
	private String face_id; //被检测出的每一张人脸都在Face++系统中的标识符
	private String face_data; //人脸本地截图的路径，如果有的话，没有为空
	private String img_id; //人脸相关的图片id
	private String url;	//相关图片的url
	
	private float width; // 0~100之间的实数，表示检出的脸的宽度在图片中百分比
	private float height; // 0~100之间的实数，表示检出的脸的高度在图片中百分比
	private PointF center; // 检出的人脸框的中心点坐标, x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	private PointF eye_left; // 相应人脸的左眼坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	private PointF eye_right; // 相应人脸的右眼坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	private PointF mouth_left; // 相应人脸的左侧嘴角坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	private PointF mouth_right; // 相应人脸的右侧嘴角坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	private PointF nose; // 相应人脸的鼻尖坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比 (0~100之间的实数)
	
	// attribute object 包含一系列人脸的属性分析结果 gender object 包含性别分析结果，value的值为Male/Female, confidence表示置信度
	private Gender gender;
	// age object 包含年龄分析结果，value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间
	private Age age;
	// race object 包含人种分析结果，value的值为Asian/White/Black, confidence表示置信度
	private Race race;
	
	private String tag;	//人脸描述
	
	/**
	 * 被检测出的每一张人脸都在Face++系统中的标识符
	 * @return
	 */
	public String getFace_id() {
		return face_id;
	}

	/**
	 * 被检测出的每一张人脸都在Face++系统中的标识符
	 * @param face_id
	 */
	public void setFace_id(String face_id) {
		this.face_id = face_id;
	}
	
	

	/**
	 * 人脸本地截图的路径，如果有的话，没有为空
	 * @return the face_data
	 */
	public String getFace_data() {
		return face_data;
	}

	/**
	 * 人脸本地截图的路径，如果有的话，没有为空
	 * @param face_data the face_data to set
	 */
	public void setFace_data(String face_data) {
		this.face_data = face_data;
	}

	/**
	 * 人脸相关的图片id
	 * @return
	 */
	public String getImg_id() {
		return img_id;
	}

	/**
	 * 人脸相关的图片id
	 * @param img_id
	 */
	public void setImg_id(String img_id) {
		this.img_id = img_id;
	}
	
	/**
	 * 图片url
	 * @return the url
	 */
	public String getUrl() {
		return url;
	}
	/**
	 * 图片url
	 * @param url the url to set
	 */
	public void setUrl(String url) {
		this.url = url;
	}
	
	/**
	 * 0~100之间的实数，表示检出的脸的宽度在图片中百分比
	 * @return
	 */
	public float getWidth() {
		return width;
	}
	
	/**
	 * 0~100之间的实数，表示检出的脸的宽度在图片中百分比
	 * @param width
	 */
	public void setWidth(float width) {
		this.width = width;
	}
	
	/**
	 * 0~100之间的实数，表示检出的脸的高度在图片中百分比
	 * @return
	 */
	public float getHeight() {
		return height;
	}
	
	/**
	 * 0~100之间的实数，表示检出的脸的高度在图片中百分比
	 * @param height
	 */
	public void setHeight(float height) {
		this.height = height;
	}
	
	/**
	 * 检出的人脸框的中心点坐标, x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @return
	 */
	public PointF getCenter() {
		return center;
	}
	
	/**
	 * 检出的人脸框的中心点坐标, x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @param center
	 */
	public void setCenter(PointF center) {
		this.center = center;
	}
	/**
	 *  相应人脸的左眼坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @return
	 */
	public PointF getEye_left() {
		return eye_left;
	}
	
	/**
	 *  相应人脸的左眼坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @param eye_left
	 */
	public void setEye_left(PointF eye_left) {
		this.eye_left = eye_left;
	}
	
	/**
	 * 相应人脸的右眼坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @return
	 */
	public PointF getEye_right() {
		return eye_right;
	}
	
	/**
	 * 相应人脸的右眼坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @param eye_right
	 */
	public void setEye_right(PointF eye_right) {
		this.eye_right = eye_right;
	}
	
	/**
	 * 相应人脸的左侧嘴角坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @return
	 */
	public PointF getMouth_left() {
		return mouth_left;
	}
	
	/**
	 * 相应人脸的左侧嘴角坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @param mouth_left
	 */
	public void setMouth_left(PointF mouth_left) {
		this.mouth_left = mouth_left;
	}
	
	/**
	 * 相应人脸的右侧嘴角坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @return
	 */
	public PointF getMouth_right() {
		return mouth_right;
	}
	
	/**
	 * 相应人脸的右侧嘴角坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比(0~100之间的实数)
	 * @param mouth_right
	 */
	public void setMouth_right(PointF mouth_right) {
		this.mouth_right = mouth_right;
	}
	
	/**
	 * 相应人脸的鼻尖坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比 (0~100之间的实数)
	 * @return
	 */
	public PointF getNose() {
		return nose;
	}
	/**
	 * 相应人脸的鼻尖坐标，x & y 坐标分别表示在图片中的宽度和高度的百分比 (0~100之间的实数)
	 * @param nose
	 */
	public void setNose(PointF nose) {
		this.nose = nose;
	}
	

	/**
	 * 性别分析结果
	 * @return
	 */
	public Gender getGender() {
		return gender;
	}
	
	/**
	 * 性别分析结果
	 * @param gender
	 */
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	
	/**
	 * 年龄分析结果
	 * @return
	 */
	public Age getAge() {
		return age;
	}
	
	/**
	 * 年龄分析结果
	 * @param age
	 */
	public void setAge(Age age) {
		this.age = age;
	}
	
	/**
	 * 人种分析结果
	 * @return
	 */
	public Race getRace() {
		return race;
	}
	
	/**
	 * 人种分析结果
	 * @param race
	 */
	public void setRace(Race race) {
		this.race = race;
	}
	
	

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Face [face_id=" + face_id + ", face_data=" + face_data
				+ ", img_id=" + img_id + ", url=" + url + ", width=" + width
				+ ", height=" + height + ", center=" + center + ", eye_left="
				+ eye_left + ", eye_right=" + eye_right + ", mouth_left="
				+ mouth_left + ", mouth_right=" + mouth_right + ", nose="
				+ nose + ", gender=" + gender + ", age=" + age + ", race="
				+ race + ", tag=" + tag + "]";
	}

	/**
	 * 人脸描述
	 * @return
	 */
	public String getTag() {
		return tag;
	}

	/**
	 * 人脸描述
	 * @param tag
	 */
	public void setTag(String tag) {
		this.tag = tag;
	}

	/**
	 * 性别
	 * @author xiaoying
	 */
	public static class Gender implements Serializable {
		/**
		 * 
		 */
		private static final long serialVersionUID = 3604771785466469504L;
		// gender object 包含性别分析结果，value的值为Male/Female, confidence表示置信度
		public String value; //值为Male/Female
		public float confidence; //置信度
		public String getValue() {
			return value;
		}
		public void setValue(String value) {
			this.value = value;
		}
		public float getConfidence() {
			return confidence;
		}
		public void setConfidence(float confidence) {
			this.confidence = confidence;
		}
		@Override
		public String toString() {
			return "Gender [value=" + value + ", confidence=" + confidence
					+ "]";
		}

	}

	/**
	 * 年龄
	 * @author xiaoying
	 */
	public static class Age implements Serializable {
		/**
		 * 
		 */
		private static final long serialVersionUID = 221737413026253122L;
		// age object 包含年龄分析结果，value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间
		public int value;	//一个非负整数表示估计的年龄
		public int range;	//估计年龄的正负区间
		public int getValue() {
			return value;
		}
		public void setValue(int value) {
			this.value = value;
		}
		public int getRange() {
			return range;
		}
		public void setRange(int range) {
			this.range = range;
		}
		@Override
		public String toString() {
			return "Age [value=" + value + ", range=" + range + "]";
		}
		
	}

	/**
	 * 种族
	 * @author xiaoying
	 */
	public static class Race implements Serializable {
		/**
		 * 
		 */
		private static final long serialVersionUID = 888019375173484388L;
		// race object 包含人种分析结果，value的值为Asian/White/Black, confidence表示置信度
		public String value; //值为Asian/White/Black
		public float confidence; //置信度
		public String getValue() {
			return value;
		}
		public void setValue(String value) {
			this.value = value;
		}
		public float getConfidence() {
			return confidence;
		}
		public void setConfidence(float confidence) {
			this.confidence = confidence;
		}
		@Override
		public String toString() {
			return "Race [value=" + value + ", confidence=" + confidence + "]";
		}
		
	}
} public class FacesetAddFaceReq extends BaseRequest {
	private String faceset_name;	//相应Faceset的name
	private String faceset_id;	//相应Faceset的id
 	private String face_id;	//一组用逗号分隔的face_id,表示将这些Face加入到相应Faceset中。
 	
 	public FacesetAddFaceReq() {
 		
 	}
 	
 	/**
 	 * 构造函数
 	 * @param faceset
 	 * @param isId 是否为ID，否则为Name，name和ID只能选其一
 	 */
 	public FacesetAddFaceReq(String faceset, boolean isId) {
 		if(isId) {
 			setFaceset_id(faceset);
 		} else {
 			setFaceset_name(faceset);
 		}
 	}
 	
	/**
	 * 相应Faceset的name
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	/**
	 * 相应Faceset的name
	 * 与setFaceset_id(String faceset_id)只能选其一
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
		this.faceset_id = null;
	}
	/**
	 * 相应Faceset的id
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	/**
	 * 相应Faceset的id
	 * 与setFaceset_name(String faceset_name)只能选其一
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
		this.faceset_name = null;
	}
	/**
	 * 一组用逗号分隔的face_id,表示将这些Face加入到相应Faceset中。
	 * @return the face_id
	 */
	public String getFace_id() {
		return face_id;
	}
	/**
	 * 一组用逗号分隔的face_id,表示将这些Face加入到相应Faceset中。
	 * @param face_id the face_id to set
	 */
	public void setFace_id(String face_id) {
		this.face_id = face_id;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetAddFaceReq [faceset_name=" + faceset_name
				+ ", faceset_id=" + faceset_id + ", face_id=" + face_id + "]";
	}
 	
} public class FacesetCreateReq extends BaseRequest {
	private String faceset_name;//Faceset的Name信息，必须在App中全局唯一。Name不能包含^@,&=*'"等非法字符，且长度不得超过255。Name也可以不指定，此时系统将产生一个随机的name。
	private String face_id;	//一组用逗号分隔的face_id, 表示将这些Face加入到该Faceset中
	private String tag;	//Faceset相关的tag，不需要全局唯一，不能包含^@,&=*'"等非法字符，长度不能超过255
	
	public FacesetCreateReq() {
		
	}
	
	public FacesetCreateReq(String faceset_name) {
		setFaceset_name(faceset_name);
	}
	
	/**
	 * (可选)
	 * Faceset的Name信息，必须在App中全局唯一。Name不能包含^@,&=*'"等非法字符，且长度不得超过255。Name也可以不指定，此时系统将产生一个随机的name。
	 * @return
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	
	/**
	 * Faceset的Name信息，必须在App中全局唯一。Name不能包含^@,&=*'"等非法字符，且长度不得超过255。Name也可以不指定，此时系统将产生一个随机的name。
	 * @param faceset_name
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
	}
	
	/**
	 * (可选)
	 * 一组用逗号分隔的face_id, 表示将这些Face加入到该Faceset中
	 * @return
	 */
	public String getFace_id() {
		return face_id;
	}
	
	/**
	 * (可选)
	 * 一组用逗号分隔的face_id, 表示将这些Face加入到该Faceset中
	 * @param face_id
	 */
	public void setFace_id(String face_id) {
		this.face_id = face_id;
	}
	
	/**
	 * (可选)
	 * Faceset相关的tag，不需要全局唯一，不能包含^@,&=*'"等非法字符，长度不能超过255
	 * @return
	 */
	public String getTag() {
		return tag;
	}
	
	/**
	 * (可选)
	 * Faceset相关的tag，不需要全局唯一，不能包含^@,&=*'"等非法字符，长度不能超过255
	 * @param tag
	 */
	public void setTag(String tag) {
		this.tag = tag;
	}
	@Override
	public String toString() {
		return "FacesetCreateReq [faceset_name=" + faceset_name + ", face_id="
				+ face_id + ", tag=" + tag + "]";
	}
} public class FacesetDeleteReq extends BaseRequest {
	private String faceset_name;	//用逗号隔开的待删除的faceset name列表
	private String faceset_id;	//用逗号隔开的待删除的faceset id列表
	
	public FacesetDeleteReq() {
		
	}
	
	public FacesetDeleteReq(String faceset, boolean isId) {
		if(isId) {
			setFaceset_id(faceset);
		} else {
			setFaceset_name(faceset);
		}
	}
	
	/**
	 * 用逗号隔开的待删除的faceset name列表
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	
	/**
	 * 用逗号隔开的待删除的faceset name列表
	 * 与setFaceset_id(String faceset_id)只能选其一
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
		this.faceset_id = null;
	}
	
	/**
	 * 用逗号隔开的待删除的faceset ide列表
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	
	/**
	 * 用逗号隔开的待删除的faceset id列表
	 * 与setFaceset_name(String faceset_name)只能选其一
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
		this.faceset_name = null;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetDeleteReq [faceset_name=" + faceset_name
				+ ", faceset_id=" + faceset_id + "]";
	}
	
} public class FacesetGetInfoReq extends BaseRequest {
	private String faceset_id;	//相应faceset的id
	private String faceset_name;	//相应faceset的name
	
	public FacesetGetInfoReq() {
		
	}
	
	public FacesetGetInfoReq(String faceset, boolean isId) {
		if(isId) {
			setFaceset_id(faceset);
		} else {
			setFaceset_name(faceset);
		}
	}
	
	/**
	 * 相应faceset的id
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	/**
	 * 相应faceset的id
	 * 与setFaceset_name(String faceset_name)只能选其一
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
		this.faceset_name = null;
	}
	/**
	 * 相应faceset的name
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	/**
	 * 相应faceset的name
	 * 与setFaceset_id(String faceset_id)只能选其一
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
		this.faceset_id = null;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetGetInfoReq [faceset_id=" + faceset_id
				+ ", faceset_name=" + faceset_name + "]";
	}
} public class FacesetRemoveFaceReq extends BaseRequest {
	private String faceset_name;	//相应Faceset的name
	private String faceset_id;	//相应Faceset的id
 	private String face_id;	//一组用逗号分隔的face_id,表示将这些Face加入到相应Faceset中。
 	
 	public FacesetRemoveFaceReq() {
		
	}
	
	public FacesetRemoveFaceReq(String faceset, boolean isId) {
		if(isId) {
			setFaceset_id(faceset);
		} else {
			setFaceset_name(faceset);
		}
	}
	/**
	 * 相应Faceset的name
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	/**
	 * 相应Faceset的name
	 * 与setFaceset_id(String faceset_id)只能选其一
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
		this.faceset_id = null;
	}
	/**
	 * 相应Faceset的id
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	/**
	 * 相应Faceset的id
	 * 与setFaceset_name(String faceset_name)只能选其一
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
		this.faceset_name = null;
	}
	/**
	 * 一组用逗号分隔的face_id,表示将这些Face加入到相应Faceset中。
	 * @return the face_id
	 */
	public String getFace_id() {
		return face_id;
	}
	/**
	 * 一组用逗号分隔的face_id,表示将这些Face加入到相应Faceset中。
	 * @param face_id the face_id to set
	 */
	public void setFace_id(String face_id) {
		this.face_id = face_id;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetRemoveFaceReq [faceset_name=" + faceset_name
				+ ", faceset_id=" + faceset_id + ", face_id=" + face_id + "]";
	}
} public class FacesetSetInfoReq {
	private String faceset_id;	//相应faceset的id
	private String faceset_name;	//相应faceset的name
	private String name;	//新的name
	private String tag;	//新的tag
	
 	public FacesetSetInfoReq() {
		
	}
	
	public FacesetSetInfoReq(String faceset, boolean isId) {
		if(isId) {
			setFaceset_id(faceset);
		} else {
			setFaceset_name(faceset);
		}
	}
	/**
	 * 相应faceset的id
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	/**
	 * 相应faceset的id
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
	}
	/**
	 * 相应faceset的name
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	/**
	 * 相应faceset的name
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
	}
	/**
	 * （可选）
	 * 新的name
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * （可选）
	 * 新的name
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * （可选）
	 * 新的tag
	 * @return the tag
	 */
	public String getTag() {
		return tag;
	}
	/**
	 * （可选）
	 * 新的tag
	 * @param tag the tag to set
	 */
	public void setTag(String tag) {
		this.tag = tag;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetSetInfoReq [faceset_id=" + faceset_id
				+ ", faceset_name=" + faceset_name + ", name=" + name
				+ ", tag=" + tag + "]";
	}
	
} public class FacesetAddFaceResp extends BaseResponse {
	private int added;	//成功加入的face数量
	private boolean success;	//表示操作是否成功
	
	
	/**
	 * 成功加入的face数量
	 * @return the added
	 */
	public int getAdded() {
		return added;
	}


	/**
	 * 成功加入的face数量
	 * @param added the added to set
	 */
	public void setAdded(int added) {
		this.added = added;
	}


	/**
	 * 表示操作是否成功
	 * @return the success
	 */
	public boolean isSuccess() {
		return success;
	}


	/**
	 * 表示操作是否成功
	 * @param success the success to set
	 */
	public void setSuccess(boolean success) {
		this.success = success;
	}


	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetAddFaceResp [added=" + added + ", success=" + success
				+ ", error=" + error + ", error_code=" + error_code + "]";
	}
	
	
} public class FacesetCreateResp extends BaseResponse {
	private String faceset_name;	//相应Faceset的name
	private String faceset_id;	//相应Faceset的id
	private int added_face;	//成功加入的face数量
	private String tag;	//Faceset相关的tag
	
	/**
	 * 相应Faceset的name
	 * @return
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	
	/**
	 * 相应Faceset的name
	 * @param faceset_name
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
	}
	
	/**
	 * 相应Faceset的id
	 * @return
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	
	/**
	 * 相应Faceset的id
	 * @param faceset_id
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
	}
	
	/**
	 * 成功加入的face数量
	 * @return
	 */
	public int getAdded_face() {
		return added_face;
	}
	
	/**
	 * 成功加入的face数量
	 * @param added_face
	 */
	public void setAdded_face(int added_face) {
		this.added_face = added_face;
	}
	
	/**
	 * Faceset相关的tag
	 * @return
	 */
	public String getTag() {
		return tag;
	}
	
	/**
	 * Faceset相关的tag
	 * @param tag
	 */
	public void setTag(String tag) {
		this.tag = tag;
	}

	@Override
	public String toString() {
		return "FacesetCreateResp [faceset_name=" + faceset_name
				+ ", faceset_id=" + faceset_id + ", added_face=" + added_face
				+ ", tag=" + tag + ", error=" + error + ", error_code="
				+ error_code + "]";
	}
} public class FacesetDeleteResp extends BaseResponse {
	private int deleted;	//成功删除的faceset数量
	private boolean success;	//表示操作是否成功
	
	/**
	 * 成功删除的faceset数量
	 * @return the deleted
	 */
	public int getDeleted() {
		return deleted;
	}

	/**
	 * 成功删除的faceset数量
	 * @param deleted the deleted to set
	 */
	public void setDeleted(int deleted) {
		this.deleted = deleted;
	}

	/**
	 * 表示操作是否成功
	 * @return the success
	 */
	public boolean isSuccess() {
		return success;
	}

	/**
	 * 表示操作是否成功
	 * @param success the success to set
	 */
	public void setSuccess(boolean success) {
		this.success = success;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetDeleteResp [deleted=" + deleted + ", success=" + success
				+ ", error=" + error + ", error_code=" + error_code + "]";
	}
	
	
} public class FacesetGetInfoResp extends BaseResponse {
	private String faceset_name;	//相应Faceset的name
	private String faceset_id;	//相应Faceset的id
	private String tag;	//Faceset相关的tag
	private List<Face> face;	//属于该faceset的face信息
	/**
	 * 相应Faceset的name
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	/**
	 * 相应Faceset的name
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
	}
	/**
	 * 相应Faceset的id
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	/**
	 * 相应Faceset的id
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
	}
	/**
	 * Faceset相关的tag
	 * @return the tag
	 */
	public String getTag() {
		return tag;
	}
	/**
	 * Faceset相关的tag
	 * @param tag the tag to set
	 */
	public void setTag(String tag) {
		this.tag = tag;
	}
	/**
	 * 属于该faceset的face信息
	 * @return the face
	 */
	public List<Face> getFace() {
		return face;
	}
	/**
	 * 属于该faceset的face信息
	 * @param face the face to set
	 */
	public void setFace(List<Face> face) {
		this.face = face;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetGetInfoResp [faceset_name=" + faceset_name
				+ ", faceset_id=" + faceset_id + ", tag=" + tag + ", face="
				+ face + ", error=" + error + ", error_code=" + error_code
				+ "]";
	}
} public class FacesetRemoveFaceResp extends BaseResponse {
	private int removed;	//成功删除的face数量
	private boolean success;	//表示操作是否成功
	/**
	 * 成功删除的face数量
	 * @return the removed
	 */
	public int getRemoved() {
		return removed;
	}
	/**
	 * 成功删除的face数量
	 * @param removed the removed to set
	 */
	public void setRemoved(int removed) {
		this.removed = removed;
	}
	/**
	 * 表示操作是否成功
	 * @return the success
	 */
	public boolean isSuccess() {
		return success;
	}
	/**
	 * 表示操作是否成功
	 * @param success the success to set
	 */
	public void setSuccess(boolean success) {
		this.success = success;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetRemoveFaceResp [removed=" + removed + ", success="
				+ success + ", error=" + error + ", error_code=" + error_code
				+ "]";
	}
} public class FacesetSetInfoResp extends BaseResponse {
	private String faceset_name;	//相应Faceset的name
	private String faceset_id;	//相应Faceset的id
	private String tag;	//Faceset相关的tag
	/**
	 * 相应Faceset的name
	 * @return the faceset_name
	 */
	public String getFaceset_name() {
		return faceset_name;
	}
	/**
	 * 相应Faceset的name
	 * @param faceset_name the faceset_name to set
	 */
	public void setFaceset_name(String faceset_name) {
		this.faceset_name = faceset_name;
	}
	/**
	 * 相应Faceset的id
	 * @return the faceset_id
	 */
	public String getFaceset_id() {
		return faceset_id;
	}
	/**
	 * 相应Faceset的id
	 * @param faceset_id the faceset_id to set
	 */
	public void setFaceset_id(String faceset_id) {
		this.faceset_id = faceset_id;
	}
	/**
	 * Faceset相关的tag
	 * @return the tag
	 */
	public String getTag() {
		return tag;
	}
	/**
	 * Faceset相关的tag
	 * @param tag the tag to set
	 */
	public void setTag(String tag) {
		this.tag = tag;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "FacesetSetInfoResp [faceset_name=" + faceset_name
				+ ", faceset_id=" + faceset_id + ", tag=" + tag + ", error="
				+ error + ", error_code=" + error_code + "]";
	}
} public class HttpUtil {
	
	
	public static HttpResponse doPost(String actionPath, Map<String, Object> params) throws ClientProtocolException, IOException {
		DefaultHttpClient client = new DefaultHttpClient();
		HttpPost post = new HttpPost(UrlConfig.BASE_URL + actionPath);
		MultipartEntity mulEntity = new MultipartEntity();
		Set<String> keys = params.keySet();
		for (String key : keys) {
			Object obj = params.get(key);
			if (obj instanceof File && obj != null) {
				mulEntity.addPart(key, new FileBody((File) obj));
			} else {
				if(obj != null && !StringUtil.isEmpty(obj.toString())) {
					mulEntity.addPart(key, new StringBody(obj.toString(), Charset.forName(UrlConfig.CHART_SET)));
				}
			}
		}
		post.setEntity(mulEntity);
		return client.execute(post);
	}
} public class Log {
	
	private static boolean isPrint = true;
	
	public static void e(String msg) {
		if(isPrint) {
			System.err.println(msg);
		}
	}
	
	public static void i(String msg) {
		if(isPrint) {
			System.out.println(msg);
		}
	}
} public class StringUtil {
	public static boolean isEmpty(String str) {
		return str == null || str.equals("");
	}
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.xiaoying.faceplusplus.api.cliet.Client;
import com.xiaoying.faceplusplus.api.config.RespConfig;
import com.xiaoying.faceplusplus.api.config.UrlConfig;
import com.xiaoying.faceplusplus.api.entity.Face;
import com.xiaoying.faceplusplus.api.entity.request.faceset.FacesetAddFaceReq;
import com.xiaoying.faceplusplus.api.entity.request.faceset.FacesetCreateReq;
import com.xiaoying.faceplusplus.api.entity.request.faceset.FacesetDeleteReq;
import com.xiaoying.faceplusplus.api.entity.request.faceset.FacesetGetInfoReq;
import com.xiaoying.faceplusplus.api.entity.request.faceset.FacesetRemoveFaceReq;
import com.xiaoying.faceplusplus.api.entity.request.faceset.FacesetSetInfoReq;
import com.xiaoying.faceplusplus.api.entity.response.faceset.FacesetAddFaceResp;
import com.xiaoying.faceplusplus.api.entity.response.faceset.FacesetCreateResp;
import com.xiaoying.faceplusplus.api.entity.response.faceset.FacesetDeleteResp;
import com.xiaoying.faceplusplus.api.entity.response.faceset.FacesetGetInfoResp;
import com.xiaoying.faceplusplus.api.entity.response.faceset.FacesetRemoveFaceResp;
import com.xiaoying.faceplusplus.api.entity.response.faceset.FacesetSetInfoResp;
import com.xiaoying.faceplusplus.api.utils.HttpUtil;
import com.xiaoying.faceplusplus.api.utils.Log;
import com.xiaoying.faceplusplus.api.utils.StringUtil;
/*
 * 文件名：FacesetService.java
 * 版权：<版权>
 * 描述：<描述>
 * 创建人：xiaoying
 * 创建时间：2013-5-14
 * 修改人：xiaoying
 * 修改时间：2013-5-14
 * 版本：v1.0
 */

package com.xiaoying.faceplusplus.api.service;




/**
 * 功能：Faceset 相关服务类
 * @author xiaoying
 */
public class FacesetService extends BaseService {

	/**
	 * @param client
	 */
	public FacesetService(Client client) {
		super(client);
	}

	/**
	 * 创建Faceset
	 * @param body
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 * @throws JSONException 
	 * @throws ParseException 
	 */
	public FacesetCreateResp createFaceset(FacesetCreateReq body) throws ClientProtocolException, IOException, ParseException, JSONException {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("api_key", client.getAppKey());
		params.put("api_secret", client.getAppSecret());
		params.put("faceset_name", body.getFaceset_name());
		params.put("face_id", body.getFace_id());
		params.put("tag", body.getTag());
		
		HttpResponse resp = HttpUtil.doPost(UrlConfig.PATH_FACESET_CREATE, params);
		JSONObject json = new JSONObject(EntityUtils.toString(resp.getEntity()));
		Log.i(json.toString());
		FacesetCreateResp result = new FacesetCreateResp();
		result.setFaceset_name(json.optString("faceset_name"));
		result.setFaceset_id(json.optString("faceset_id"));
		result.setTag(json.optString("tag"));
		result.setAdded_face(json.optInt("added_face"));
		result.setError(json.optString("error"));
		result.setError_code(json.optInt("error_code", RespConfig.RESP_OK));
		return result;
	}

	/**
	 * 删除指定的Faceset
	 * @param body
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 * @throws JSONException 
	 * @throws ParseException 
	 */
	public FacesetDeleteResp deleteFaceset(FacesetDeleteReq body) throws ClientProtocolException, IOException, ParseException, JSONException {