content: package com.alibaba.json.test.performance;
  
  import java.io.IOException;
  import java.math.BigDecimal;
  import java.util.Date;
  import java.util.List;
  
  import org.codehaus.jackson.JsonLocation;
  import org.codehaus.jackson.JsonParseException;
  import org.codehaus.jackson.JsonParser;
  import org.codehaus.jackson.JsonToken;
  
  import com.alibaba.fastjson.JSONException;
  import com.alibaba.json.test.entity.Company;
  import com.alibaba.json.test.entity.Department;
  import com.alibaba.json.test.entity.Employee;
  import com.alibaba.json.test.entity.Group;
  
  public class JacksonGroupParser {
  
      private JsonParser parser;
  
      public JacksonGroupParser(JsonParser parser) throws Exception{
          this.parser = parser;
          parser.nextToken(); // move to the start of the
      }
  
      public Group parseGroup() throws Exception {
          Group group = new Group();
  
          accept(JsonToken.START_OBJECT);
  
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_OBJECT) {
                  break;
              }
  
              if (tok == JsonToken.FIELD_NAME) {
                  String name = parser.getCurrentName();
                  tok = parser.nextToken();
  
                  if ("name" == name) {
                      group.setName(acceptString(tok));
                  } else if ("description" == name) {
                      group.setDescription(acceptString(tok));
                  } else if ("companies" == name) {
                      parseCompany(group.getCompanies());
                  } else {
                      throw new RuntimeException("not match property : " + name);
                  }
              }
          }
  
          accept(JsonToken.END_OBJECT);
  
          return group;
      }
  
      private Company parseCompany() throws Exception {
          Company company = new Company();
  
          accept(JsonToken.START_OBJECT);
  
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_OBJECT) {
                  break;
              }
  
              if (tok == JsonToken.FIELD_NAME) {
                  String name = parser.getCurrentName();
                  tok = parser.nextToken();
  
                  if ("name" == name) {
                      company.setName(acceptString(tok));
                  } else if ("description" == name) {
                      company.setDescription(acceptString(tok));
                  } else if ("stock" == name) {
                      company.setStock(acceptString(tok));
                  } else if ("id" == name) {
                      company.setId(acceptLong(tok));
                  } else if ("rootDepartment" == name) {
                      company.setRootDepartment(parseDepartment());
                  } else {
                      throw new RuntimeException("not match property : " + name);
                  }
              }
          }
  
          accept(JsonToken.END_OBJECT);
  
          return company;
      }
  
      private Department parseDepartment() throws Exception {
          accept(JsonToken.START_OBJECT);
  
          Department company = new Department();
  
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_OBJECT) {
                  break;
              }
  
              if (tok == JsonToken.FIELD_NAME) {
                  String name = parser.getCurrentName();
                  tok = parser.nextToken();
  
                  if ("name" == name) {
                      company.setName(acceptString(tok));
                  } else if ("description" == name) {
                      company.setDescription(acceptString(tok));
                  } else if ("id" == name) {
                      company.setId(acceptLong(tok));
                  } else if ("children" == name) {
                      parseDepartment(company.getChildren());
                  } else if ("members" == name) {
                      parseEmployee(company.getMembers());
                  } else {
                      throw new RuntimeException("not match property : " + name);
                  }
              }
          }
  
          accept(JsonToken.END_OBJECT);
  
          return company;
      }
  
      private Employee parseEmployee() throws Exception {
          accept(JsonToken.START_OBJECT);
  
          Employee emp = new Employee();
  
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_OBJECT) {
                  break;
              }
  
              if (tok == JsonToken.FIELD_NAME) {
                  String name = parser.getCurrentName();
                  tok = parser.nextToken();
  
                  if ("name" == name) {
                      emp.setName(acceptString(tok));
                  } else if ("description" == name) {
                      emp.setDescription(acceptString(tok));
                  } else if ("number" == name) {
                      emp.setNumber(acceptString(tok));
                  } else if ("id" == name) {
                      emp.setId(acceptLong(tok));
                  } else if ("age" == name) {
                      emp.setAge(acceptInteger(tok));
                  } else if ("salary" == name) {
                      emp.setSalary(acceptBigDecimal(tok));
                  } else if ("birthdate" == name) {
                      emp.setBirthdate(new Date(acceptLong(tok)));
                  } else if ("badboy" == name) {
                      emp.setBadboy(acceptBoolean(tok));
                  } else {
                      throw new RuntimeException("not match property : " + name);
                  }
              }
          }
  
          accept(JsonToken.END_OBJECT);
  
          return emp;
      }
  
      private void parseEmployee(List<Employee> list) throws Exception {
          accept(JsonToken.START_ARRAY);
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_ARRAY) {
                  break;
              }
  
              list.add(parseEmployee());
          }
          accept(JsonToken.END_ARRAY);
      }
  
      private void parseDepartment(List<Department> list) throws Exception {
          accept(JsonToken.START_ARRAY);
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_ARRAY) {
                  break;
              }
  
              list.add(parseDepartment());
          }
          accept(JsonToken.END_ARRAY);
      }
  
      private void parseCompany(List<Company> list) throws Exception {
          accept(JsonToken.START_ARRAY);
          for (;;) {
              JsonToken tok = parser.getCurrentToken();
  
              if (tok == JsonToken.END_ARRAY) {
                  break;
              }
  
              list.add(parseCompany());
          }
          accept(JsonToken.END_ARRAY);
      }
  
      private String acceptString() throws Exception {
          if (parser.getCurrentToken() == JsonToken.VALUE_STRING) {
              String stringValue = parser.getText();
              parser.nextToken();
              return stringValue;
          } else {
              throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
          }
      }
  
      private String acceptString(JsonToken token) throws Exception {
          if (token == JsonToken.VALUE_STRING) {
              String stringValue = parser.getText();
              parser.nextToken();
              return stringValue;
          } else {
              throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
          }
      }
  
      private Long acceptLong(JsonToken token) throws Exception {
          if (token == JsonToken.VALUE_NUMBER_INT) {
              long value = parser.getLongValue();
              parser.nextToken();
              return value;
          } else {
              throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
          }
      }
  
      private boolean acceptBoolean(JsonToken token) throws Exception {
          if (token == JsonToken.VALUE_TRUE) {
              parser.nextToken();
              return true;
          } else if (token == JsonToken.VALUE_FALSE) {
              parser.nextToken();
              return false;
          } else {
              throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
          }
      }
  
      private BigDecimal acceptBigDecimal(JsonToken token) throws Exception {
          if (token == JsonToken.VALUE_NUMBER_FLOAT) {
              BigDecimal value = parser.getDecimalValue();
              parser.nextToken();
              return value;
          } else {
              throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
          }
      }
  
      private Integer acceptInteger(JsonToken token) throws Exception {
          if (token == JsonToken.VALUE_NUMBER_INT) {
              int value = parser.getIntValue();
              parser.nextToken();
              return value;
          } else {
              throw new JSONException("syntax error, expect string, actual " + parser.getCurrentToken());
          }
      }
  
      private void accept(JsonToken token) throws Exception {
          if (parser.getCurrentToken() == token) {
              parser.nextToken();
          } else {
              throw new JSONException("syntax error, expect " + token + ", actual " + parser.getCurrentToken());
          }
      }
  
      public static String getNextTextValue(String fieldName, JsonParser parser) throws JsonParseException, IOException {
          JsonToken current = parser.nextToken(); // move to filed
          if (current != JsonToken.FIELD_NAME || !fieldName.equals(parser.getCurrentName())) {
              reportParseError("Error occoured while getting value by field name:" + fieldName, parser.getCurrentLocation());
          }
          current = parser.nextToken(); // move to value
          return parser.getText();
      }
  
      public static void reportParseError(String errorMsg, JsonLocation jsonLoc) throws JsonParseException {
          throw new JsonParseException(errorMsg, jsonLoc);
      }
  }
  