docletとpoiを使ってみる

以前のテストプチフレームワークづくりの続き。


テスト結果を比較する際に、期待する結果を記述するExcelファイルの作成を支援するツール。(あくまでベース)
こんな感じかな。


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.RootDoc;

public class CreateExceptSheet {

  enum Type {
    JAVA_DOC, FIELD_NAME
  }

  /**
   * @param root
   * @return
   */
  public static boolean start(RootDoc root) {
    try {
      CreateExceptSheet ces = new CreateExceptSheet();
      List<Map<Type, String>> column = ces.getColumn(root);
      ces.createXlsFile(column);
      return true;
    } catch (Exception e) {
      return false;
    }
  }

  /**
   * @param root
   * @return
   */
  private List<Map<Type, String>> getColumn(RootDoc root) {
    List<Map<Type, String>> ret = new ArrayList<Map<Type, String>>();
    for (ClassDoc clazz : root.classes()) {
      for (MethodDoc method : clazz.methods()) {
        if (method.name().matches("^get.+$")) {
          Map<Type, String> entry = new HashMap<Type, String>();
          entry.put(
            Type.FIELD_NAME,
            method.name().replace("get","")
          );
          entry.put(
            Type.JAVA_DOC,
            method.tags("@return")[0].text()
          );
          ret.add(entry);
        }
      }
    }
    return ret;
  }

  /**
   * @param column
   * @throws IOException
   */
  private void createXlsFile(List<Map<Type, String>> column)
      throws IOException {
    OutputStream xlsFile = null;
    try {
      HSSFWorkbook workBook = new HSSFWorkbook();
      HSSFSheet sheet = workBook.createSheet("sample");
      HSSFCellStyle style = createCellStyle(workBook);
      int rowCount = 0;
      for (Type key : Type.values()) {
        HSSFRow row = sheet.createRow(rowCount++);
        int cellCount = 0;
        for (Map<Type, String> entry : column) {
          HSSFCell cell = row.createCell(cellCount++);
          cell.setCellStyle(style);
          cell.setCellValue(entry.get(key));
        }
      }
      // sheet.createFreezePane(0, 0, 0, 1);
      xlsFile = new FileOutputStream("except.xls");
      workBook.write(xlsFile);
    } finally {
      if (xlsFile != null) {
        xlsFile.close();
      }
    }
  }

  /**
   * @param workBook
   * @return
   */
  private HSSFCellStyle createCellStyle(HSSFWorkbook workBook) {
    HSSFFont font = workBook.createFont();
    font.setFontHeightInPoints((short) 11);
    font.setFontName("MS Pゴシック");
    HSSFCellStyle style = workBook.createCellStyle();
    style.setFont(font);
    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    style.setBottomBorderColor(HSSFColor.BLACK.index);
    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    style.setLeftBorderColor(HSSFColor.BLACK.index);
    style.setBorderRight(HSSFCellStyle.BORDER_THIN);
    style.setRightBorderColor(HSSFColor.BLACK.index);
    style.setBorderTop(HSSFCellStyle.BORDER_THIN);
    style.setTopBorderColor(HSSFColor.BLACK.index);
    style.setFillBackgroundColor(HSSFColor.BLUE.index);
    return style;
  }

}