/**
  * @param gdReq
  * @return GridData
  * @since 2015/09/09
  */
 public static GridData cloneResponseGridData(GridData gdReq) throws Exception {
   GridData gdRes = new GridData();
   // mode 추가
   gdRes.setMode(gdReq.getMode());
   String headers[] = gdReq.getHeaderSequence();
   for (int i = 0; i < gdReq.getHeaderCount(); i++) {
     GridHeader ghValue = gdReq.getHeader(headers[i]);
     String headerDataType = gdReq.getHeader(headers[i]).getDataType();
     gdRes.createHeader(headers[i], headerDataType);
     if (headerDataType.equals("L")) {
       if (ghValue.getComboValues() != null)
         if (ghValue.getComboValues().length != 0)
           gdRes
               .getHeader(headers[i])
               .setComboValues(ghValue.getComboValues(), ghValue.getComboHiddenValues());
       // 오리진 콤보데이터 확인을 위한 코드.
       gdRes
           .getHeader(headers[i])
           .setOriginComboValues(
               ghValue.getOriginComboValues(), ghValue.getOriginComboHiddenValues());
       if (ghValue.hasComboList()) {
         for (int j = 0; j < ghValue.getComboListCount(); j++) {
           String comboListKey = ghValue.getComboListKeys()[j];
           gdRes
               .getHeader(headers[i])
               .addComboListValues(
                   comboListKey,
                   ghValue.getComboValues(comboListKey),
                   ghValue.getComboHiddenValues(comboListKey));
         }
       }
     } else if (headerDataType.equals("I")) {
       if (ghValue.getImageURLs() != null)
         if (ghValue.getImageURLs().length != 0)
           gdRes.getHeader(headers[i]).setImageURLs(ghValue.getImageURLs());
     }
   }
   return gdRes;
 }
  /**
   * WiseGrid 에 전달할 GridData 를 전문화해서 전송
   *
   * @param gridObj realGrid 에 전달할 GridData 객체
   * @param out 일반조회용 Out
   * @param out2 압축조회용 Out
   * @param bMulti 통합통신 여부
   * @param bUseHiddenValue HiddenValue 사용 유무 - 현재는 사용안함
   * @throws Exception
   * @since v2, 0, 0, 1
   */
  private static void write(
      GridData gridObj, Writer out, OutputStream out2, boolean bMulti, boolean bUseHiddenValue)
      throws Exception {

    if (out == null) {
      throw new Exception("Not available write method arguments!");
    }

    // 동적메소드 사용여부 확인.
    //        if (gridObj.hasDynamicMethod()) { }

    LinkedHashMap<String, Object> jsonResponseString = new LinkedHashMap<String, Object>();
    // 헤더에서 데이터 추출 및 JSON형식으로 파싱

    String gridMode = gridObj.getMode();

    if ("search".equals(gridMode)) {

      jsonResponseString.put(json_mode, gridMode);
      GridHeader[] gridHeaders = gridObj.getHeaders();
      String[][] rowData = new String[gridHeaders[0].getRowCount()][gridHeaders.length];
      List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
      String[] comboListValues = null;
      String[] comboListHiddenValues = null;

      // 그리드 헤더수만큼 for, 헤더의 row수 만큼 데이터 추출
      for (int i = 0; i < gridHeaders.length; i++) {

        // setComboValues() 를 만나 콤보리스트 값이 변경이 되었을 경우만 콤보리스트 셋팅하여 response로 내려준다.
        if (t_combo.equals(gridHeaders[i].getDataType())
            && gridHeaders[i].getComboListChange() == true) {
          // 콤보리스트 -> listItems
          int comboListItemCount = gridHeaders[i].getComboListItemCount();
          comboListValues = gridHeaders[i].getComboValues();
          comboListHiddenValues = gridHeaders[i].getComboHiddenValues();
          /*
           * 리스트 <- 맵 <-  리스트 -< 맵
           * */
          LinkedHashMap<String, Object> comboItemMap = new LinkedHashMap<String, Object>();
          List<LinkedHashMap<String, String>> comboSetList =
              new ArrayList<LinkedHashMap<String, String>>();
          for (int k = 0; k < comboListItemCount; k++) {
            LinkedHashMap<String, String> comboDataSet = new LinkedHashMap<String, String>();
            comboDataSet.put(comboListValues[k], comboListHiddenValues[k]);
            comboSetList.add(comboDataSet);
          }
          comboItemMap.put(gridHeaders[i].getID(), comboSetList);
          listItems.add(comboItemMap);
        }

        for (int j = 0; j < gridHeaders[i].getRowCount(); j++) {
          rowData[j][i] = gridHeaders[i].getValue(j);
        }
      }
      jsonResponseString.put("rows", rowData);
      if (listItems.size() != 0) {
        jsonResponseString.put("listItems", listItems);
      }
    } else {
      jsonResponseString.put(json_mode, "save");
    }

    jsonResponseString.put(messageid, gridObj.getMessage());
    jsonResponseString.put(statusid, gridObj.getStatus());
    out.write(new ObjectMapper().writeValueAsString(jsonResponseString));
  }