お手軽便利Calendarユーティリティ

SimpleDateFormatを使ったお手軽Calendarユーティリティの例。

/**
 * フォーマットを指定し、文字列からDateオブジェクトへ変換する。
 *
 * @param aDate
 * @param aFormat
 * @return
 * @throws java.text.ParseException
 */
public static Date StringToDate(String aDate, String aFormat) throws ParseException {
    DateFormat dateFormat = new SimpleDateFormat(aFormat);
    return dateFormat.parse(aDate);
}

/**
 * フォーマットを指定し、Dateオブジェクトから文字列へ変換する。
 *
 * @param aDate
 * @param aFormat
 * @return
 */
public static String DateToString(Date aDate, String aFormat) {
    DateFormat dateFormat = new SimpleDateFormat(aFormat);
    return dateFormat.format(aDate);
}

/**
 * 指定したDateオブジェクトの、初日(1日)のDateオブジェクトを返す。
 *
 * @param aDate
 * @return
 */
public static Date getActualFirstDate( Date aDate ){
    Calendar cal = Calendar.getInstance();
    cal.setTime( aDate );

    int firstDay = cal.getActualMinimum( Calendar.DATE );

    int year = cal.get( Calendar.YEAR );
    int month = cal.get( Calendar.MONTH );
    cal.set(year, month, firstDay);

    return cal.getTime();
}

/**
 * 指定したDateオブジェクトの、末日の日付文字列を返す。
 *
 * @param aDate
 * @param aFormat
 * @return
 */
public static String getActualFirstDate( Date aDate, String aFormat ){

    return DateToString( ConvertDateUtil.getActualFirstDate(aDate), aFormat);

}


/**
 * 指定したDateオブジェクトの、末日のDateオブジェクトを返す。
 *
 * @param aDate
 * @return
 */
public static Date getActualLastDate( Date aDate ){
    Calendar cal = Calendar.getInstance();
    cal.setTime( aDate );

    int lastDay = cal.getActualMaximum( Calendar.DATE );

    int year = cal.get( Calendar.YEAR );
    int month = cal.get( Calendar.MONTH );
    cal.set(year, month, lastDay);

    return cal.getTime();
}

/**
 * 指定したDateオブジェクトの、末日の日付文字列を返す。
 *
 * @param aDate
 * @param aFormat
 * @return
 */
public static String getActualLastDate( Date aDate, String aFormat ){

    return DateToString( ConvertDateUtil.getActualLastDate(aDate), aFormat);

}


意外と多用するので、Utilクラスとして一つ作っておくと便利です。
便利クラス系は、Jakarta-commons等で充実しているけれど、中でやっていることの意味を知ることが
重要だと思うので、あまり時間が掛からなければ自分で作るのも手かな、と思います。

コンストラクタのリフレクション

引数有りコンストラクタのリフレクション。

try{
    // getConstructorの引数は、リクレクションするクラスコンストラクタ引数の型
    Constructor ct = hogeclass.getConstructor( arg.getClass() );
    // new hogeclass(arg) と同意義。
    return ct.newInstance(arg);
}
catch( NoSuchMethodException ex ){
    ex.printStackTrace();
    return null;
}
catch( Exception ex2 ){
    ex2.printStackTrace();
    return null;
}


Class.getConstructorの引数、及びConstructor.newInstanceの引数は可変個なので、
複数の引数を持つコンストラクタにも対応している。
上記例は、wicketの共通Panel内で、任意のWebPageクラスインスタンスを生成する為に実装した例です。

Wicket:DropDownChoice備忘録

今だに慣れないDropDownChoiceの設定。
うーん、もっとスマートなやり方があるっぽいなぁ。PropertyModelの原理を理解した方が良さそうだ。

■Class Field

private DropDownChoice rangeDropDown;
private List rangeList = new ArrayList();
private DropDownType selectDropDownType;


■DropDownChoice設定

rangeDropDown =
        new DropDownChoice("rangeDropdown", new PropertyModel(this, "selectDropDownType"),
        rangeList, new ChoiceRenderer("name"));
rangeDropDown.setEscapeModelStrings(false);
rangeDropDown.setRequired(true);


■List値作成Method & PropertyModelにバインドするBeanインスタンスのSetter/Getter

private void createRangeList() {
    rangeList.add(new DropDownType("月別"));
    rangeList.add(new DropDownType("日別"));
    rangeList.add(new DropDownType("時別"));
}

public DropDownType getSelectDropDownType() {
    return selectDropDownType;
}

public void setSelectDropDownType(DropDownType selectDropDownType) {
    this.selectDropDownType = selectDropDownType;
}


■PropertyModelにバインドするBean(インナークラス)

    class DropDownType implements Serializable {

        private String name;

        public DropDownType(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

Wicket:ストリームダウンロード処理

色々試したけど、こんな感じで落ち着きました。


■SubmitLink実装

SubmitLink submit = new SubmitLink("outputButton", form){
    @Override
    public void onSubmit(){
        // RequestTarget設定(インナークラス"CSVResourceStreamWriter.write"に処理を委譲)
        IRequestTarget target = 
                new ResourceStreamRequestTarget( new CSVResourceStreamWriter(), "AccessReport.csv");
        getRequestCycle().setRequestTarget(target);
    }
};

■インナークラス(AbstractResourceStreamWriter実装)

class CSVResourceStreamWriter extends AbstractResourceStreamWriter{
    /**
     * OutputStreamによるCSV出力処理を実装する。
     *
     * @param out
     */
    @Override
    public void write(OutputStream out ) {
        try{
			// outputStreamへの書き出しサンプル
            String tmp = new String("CSVダウンロードテスト");
            byte[] byteArray = tmp.getBytes("UTF-8");
            out.write(byteArray);
        }
        finally{
            try{
                out.flush();
                out.close();
            }
            catch( IOException iex ){
                iex.printStackTrace();
            }
        }
    }

    /**
     * Content-Type要素を定義する。
     *
     * @return
     */
    @Override
    public String getContentType() {
        // Conent-Type設定
        return "application/octet-stream;charset=UTF-8";
    }
}

AbstractResourceStreamWriter.write(OutputStream)メソッドの実装部分で、DBからのデータ取得などをやってやれば良いかと。

wicketって色んなコンポーネント持ってるなぁ。しみじみ。

ブログ開設

仕事がらみの技術TIPSがたまってきたこともあり、整理するためにブログを開設しました。

主にJava関連、Server技術関連などをまとめていこうと思っています。
仕事で調べものをするにしても、他の方々のブログって結構参考にしてるんですよね。
なんで、自分も有益な情報をネットに還元していけたらなぁと思っています。

あとは、徒然と日々思うことなどを書き留めて行ければ、と。

とりあえずApache WicketのTIPSをまとめよう。