Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

RubyでJavaのpackage-info.javaを一括生成するスクリプト

概要

JavaDocのパッケージ内容を記述するpackage-info.javaを生成するスクリプト

内容

Javaの各パッケージごとのJavaDocを一括生成するためのスクリプトRubyで作成します。

要件は以下
・ルートフォルダにrbファイルを配置
・実行すると配下にあるすべてのパッケージにpackage-info.javaを作成
・package-info.javaの中身は以下

/**
 * "パッケージのパス"パッケージ。
 *
 * <pre>
 * // TODO パッケージ内容の詳細を記述してください
 * </pre>
 * 
 */
package パッケージのパス;

ソースコード

# encoding: Windows-31J
require "erb"
require 'find'

PACKAGE_INFO = "package-info.java"

# package-info.javaのコードを生成する
def generate_package_info_code(package_info)

# package-info.javaのテンプレートを定義
template =<<EOS
/**
 * <%=package_info%>パッケージ。
 *
 * <pre>
 * <%=class_info_detail%>
 * </pre>
 * 
 */
package <%=package_info%>;
EOS
  out = ERB.new(template)
  class_info_detail = "// TODO パッケージ内容の詳細を記述してください"
  package_info = package_info
  return out.result(binding)
end

# fileの階層からパッケージ名を生成
def get_package_name(file)
  return file.slice(2,file.size).gsub(/\//,".")
end

# fileパスにcodeの内容を出力する
def generate_package_info_file(file, code)
  return if file == "./"
  file = open("#{file}/#{PACKAGE_INFO}", "w")
  file.puts code
  file.close
end

# カレントフォルダ配下の全フォルダに対して処理
Find.find('./').each do |file|
  if File.directory?(file)
    package_info_code = generate_package_info_code(get_package_name(file))
    generate_package_info_file(file, package_info_code)
  end
end

puts "出力完了。出力結果"
file_list = []
Find.find('./').each do |file|
  puts file if (File.basename(file) == PACKAGE_INFO)
end

出力結果サンプル抜粋

./jp/
./jp/co/
./jp/co/package1/
./jp/co/package1/package1_1/
./jp/co/package1/package1_2/
./jp/co/package2/
./jp/co/package2/package2_1/
./jp/co/package2/package2_2/
に対して実行。

※出力確認用標準出力

出力完了。出力結果
./jp/co/package-info.java
./jp/co/package1/package-info.java
./jp/co/package1/package1_1/package-info.java
./jp/co/package1/package1_2/package-info.java
./jp/co/package2/package-info.java
./jp/co/package2/package2_1/package-info.java
./jp/co/package2/package2_2/package-info.java
./jp/package-info.java

実際に出力されたファイルの1例を確認
対象=./jp/co/package1/package1_1/package-info.java

/**
 * jp.co.package1.package1_1パッケージ。
 *
 * <pre>
 * // TODO パッケージ内容の詳細を記述してください
 * </pre>
 * 
 */
package jp.co.package1.package1_1;