    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.taglet;
    017
    018import com.sun.tools.doclets.Taglet;
    019import com.sun.javadoc.Tag;
    020import java.util.Map;
    021
    022/**
    023 * ソースコメントから、Javadoc を作成する場合のカスタムタグ情報を作成する
    024 * Taglet インターフェースの実装クラスを作成します。
    025 * og.value タグ(形式サンプル)を処理します。
    026 *
    027 * このタグは、インラインタグ 定義されているため、@og.tag などに含まれると処理されません。
    028 * そこで、 DocletTagWriter#printTag( final Tag[] tag ) に処理を追加する必要があります。
    029 *
    030 * @og.rev 5.5.4.1 (2012/07/06) 新規作成
    031 *
    032 * @version  4.0
    033 * @author   Kazuhiko Hasegawa
    034 * @since    JDK5.0,
    035 */
    036public class TagletValue extends AbstractTaglet {
    037
    038        private static final String NAME   = "og.value";
    039
    040        /**
    041         * このタグレットがインラインタグで
    042         * 使用されている場合、true を返します。
    043         * そうでない場合については false が設定されます。
    044         *
    045         * @return インラインタグの場合は true、そうでない場合は false を返します
    046         */
    047        @Override
    048        public boolean isInlineTag() {
    049                return true;
    050        }
    051
    052        /**
    053         * 実行時にドックレットがタグレットを読み込んで使用するには、
    054         * そのタグレットが、次のシグニチャでマップ を引数として受け取る、
    055         * レジスタ と呼ばれる static メソッドをもっている必要があります。
    056         * このメソッドは、タグレット名をキーとして、カスタムタグレットの
    057         * インスタンスをマップに追加します。 タグレットをオーバーライドする場合、
    058         * 名前の競合を避けるため、新しいタグレットのインスタンスをマップに
    059         * 追加する前に、オーバーライドされる側のタグレットをマップから
    060         * 削除する必要があります。
    061         *
    062         * @param tagletMap タグレットマップ
    063         */
    064        public static void register( final Map<String,Taglet> tagletMap ) {
    065           TagletValue tagTag = new TagletValue();
    066           Taglet tag = tagletMap.get(NAME);
    067           if(tag != null) {
    068                   tagletMap.remove(NAME);
    069           }
    070           tagletMap.put(NAME, tagTag);
    071        }
    072
    073        /**
    074         * このカスタムタグの名前を返します。
    075         *
    076         * @return カスタムタグの名前
    077         */
    078        public String getName() {
    079                return NAME;
    080        }
    081
    082        /**
    083         * このカスタムタグのタグ表現を受け取り、
    084         * 文字列としての表現を返し、生成されたページに出力します。
    085         *
    086         * @param tagTag このカスタムタグのタグ表現
    087         *
    088         * @return このタグの文字列としての表現
    089         */
    090        public String toString( final Tag tagTag ) {
    091                return DocletUtil.valueTag( tagTag );
    092        }
    093
    094        /**
    095         * このカスタムタグのタグ表現の配列を受け取り、
    096         * 文字列としての表現を返し、生成されたページに出力します。
    097         * このタグレットがインラインタグを表す場合、
    098         * このメソッドは null を返します。
    099         *
    100         * @param tagTags       このカスタムタグを表すタグの配列
    101         *
    102         * @return このタグの文字列としての表現
    103         */
    104        public String toString( final Tag[] tagTags ) {
    105                if(tagTags.length == 0) {
    106                        return null;
    107                }
    108                StringBuilder result = new StringBuilder();
    109                for(int i = 0; i < tagTags.length; i++) {
    110                        result.append( DocletUtil.valueTag( tagTags[i] ) );
    111                }
    112                return result.toString();
    113        }
    114}