content: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing,
   * software distributed under the License is distributed on an
   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   * KIND, either express or implied.  See the License for the
   * specific language governing permissions and limitations
   * under the License.
   */
  /**
   * @author forrestxm
   *
   */
  package org.apache.aries.samples.blueprint.idverifier.server;
  
  import java.text.ParseException;
  import java.text.SimpleDateFormat;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  import org.apache.aries.samples.blueprint.idverifier.api.PersonIDVerifier;
  
  public class PersonIDVerifierSimpleImpl implements PersonIDVerifier {
  	String areacode;
  	String birthcode;
  	String suffixcode;
  	
  	String id;
  	
  	String area_str;
  	String birth_str;
  	String gender_str;
  	
  	static final String GENDER_MAN = "man";
  	static final String GENDER_WOMAN = "woman";
  	
  	/**
  	 * @return the area_str
  	 */
  	public String getArea_str() {
  		return area_str;
  	}
  
  	/**
  	 * @param areaStr the area_str to set
  	 */
  	public void setArea_str(String areaStr) {
  		area_str = areaStr;
  	}
  
  	/**
  	 * @return the birth_str
  	 */
  	public String getBirth_str() {
  		return birth_str;
  	}
  
  	/**
  	 * @param birthStr the birth_str to set
  	 */
  	public void setBirth_str(String birthStr) {
  		birth_str = birthStr;
  	}
  
  	/**
  	 * @return the gender_str
  	 */
  	public String getGender_str() {
  		return gender_str;
  	}
  
  	/**
  	 * @param genderStr the gender_str to set
  	 */
  	public void setGender_str(String genderStr) {
  		gender_str = genderStr;
  	}
  
  	/**
  	 * @return the areacode
  	 */
  	public String getAreacode() {
  		return areacode;
  	}
  
  	/**
  	 * @param areacode the areacode to set
  	 */
  	public void setAreacode(String areacode) {
  		this.areacode = areacode;
  	}
  
  	/**
  	 * @return the birthcode
  	 */
  	public String getBirthcode() {
  		return birthcode;
  	}
  
  	/**
  	 * @param birthcode the birthcode to set
  	 */
  	public void setBirthcode(String birthcode) {
  		this.birthcode = birthcode;
  	}
  
  	/**
  	 * @return the suffixcode
  	 */
  	public String getSuffixcode() {
  		return suffixcode;
  	}
  
  	/**
  	 * @param suffixcode the suffixcode to set
  	 */
  	public void setSuffixcode(String suffixcode) {
  		this.suffixcode = suffixcode;
  	}
  
  	/**
  	 * @return the id
  	 */
  	public String getId() {
  		return id;
  	}
  	
  	public void setId(String id) {
  		this.id = id;
  
  	}	
  
  	public String getArea() {
  		
  		return this.getArea_str();
  	}
  
  	public String getBirthday() {
  		
  		return this.getBirth_str();
  	}
  
  	public String getGender() {		
  		return this.getGender_str();
  	}
  
  	
  
  	public boolean verify() {
  		boolean b = false;
  		b = isValidID() && isValidArea() && isValidBirth() && isValidSuffix();
  		return b;
  	}
  	
  	boolean isValidID(){
  		boolean b = false;
  		if (this.id.length() == 18) {
  			b = true;
  			this.setAreacode(this.id.substring(0, 6));
  			this.setBirthcode(this.id.substring(6, 14));
  			this.setSuffixcode(this.id.substring(14));
  		}
  		return b;
  	}
  	
  	boolean isValidArea(){
  		boolean b = false;
  		Pattern p = Pattern.compile("\\d{6}");
  		Matcher m = p.matcher(getAreacode());
  		if (m.matches()){
  			this.setArea_str(getAreacode());
  			b = true;
  		}
  		return b;
  	}
  	
  	boolean isValidBirth() {
  		String birthdate = toDateFormat(getBirthcode(), "-");
  		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  		try {
  			this.setBirth_str(sdf.format(sdf.parse(birthdate)));
  			return true;
  		} catch (ParseException e) {
  			e.printStackTrace();
  		}
  		return false;
  	}
  	
  	boolean isValidSuffix() {
  		boolean b = false;
  		Pattern p = Pattern.compile("\\d{3}[\\dX]");
  		Matcher m = p.matcher(getSuffixcode());
  		if(m.matches()){
  			b = true;
  			setGender(getSuffixcode());
  		}
  		return b;
  	}
  
  	String toDateFormat(String s, String delimiter) {
  		StringBuffer sb = new StringBuffer();
  		sb.append(s.substring(0, 4));
  		sb.append(delimiter);
  		sb.append(s.substring(4, 6));
  		sb.append(delimiter);
  		sb.append(s.substring(6));
  		return sb.toString();
  	}
  	
  	private void setGender(String s){
  		int gender = Integer.parseInt(new Character(s.charAt(2)).toString());
  		int remain = gender % 2;
  		if (remain == 0 ){
  			this.setGender_str(GENDER_WOMAN);
  		} else {
  			this.setGender_str(GENDER_MAN);
  		}
  	}
  
  }
  