    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;
    021import org.opengion.fukurou.util.StringUtil;
    022
    023/**
    024 * ソースコメントから、Javadoc を作成する場合のカスタムタグ情報を作成する
    025 * Taglet インターフェースの実装クラスを作成します。
    026 * og.value タグ(形式サンプル)を処理します。
    027 *
    028 * このタグは、インラインタグ 定義されているため、@og.tag などに含まれると処理されません。
    029 * そこで、 DocletTagWriter#printTag( final Tag[] tag ) に処理を追加する必要があります。
    030 *
    031 * @og.rev 5.5.4.1 (2012/07/06) 新規作成
    032 *
    033 * @version  4.0
    034 * @author   Kazuhiko Hasegawa
    035 * @since    JDK5.0,
    036 */
    037public class TagletValue extends AbstractTaglet {
    038
    039        private static final String NAME   = "og.value";
    040
    041        /**
    042         * このタグレットがインラインタグで
    043         * 使用されている場合、true を返します。
    044         * そうでない場合については false が設定されます。
    045         *
    046         * @return インラインタグの場合は true、そうでない場合は false を返します
    047         */
    048        @Override
    049        public boolean isInlineTag() {
    050                return true;
    051        }
    052
    053        /**
    054         * 実行時にドックレットがタグレットを読み込んで使用するには、
    055         * そのタグレットが、次のシグニチャでマップ を引数として受け取る、
    056         * レジスタ と呼ばれる static メソッドをもっている必要があります。
    057         * このメソッドは、タグレット名をキーとして、カスタムタグレットの
    058         * インスタンスをマップに追加します。 タグレットをオーバーライドする場合、
    059         * 名前の競合を避けるため、新しいタグレットのインスタンスをマップに
    060         * 追加する前に、オーバーライドされる側のタグレットをマップから
    061         * 削除する必要があります。
    062         *
    063         * @param tagletMap タグレットマップ
    064         */
    065        public static void register( final Map<String,Taglet> tagletMap ) {
    066           TagletValue tagTag = new TagletValue();
    067           Taglet tag = tagletMap.get(NAME);
    068           if(tag != null) {
    069                   tagletMap.remove(NAME);
    070           }
    071           tagletMap.put(NAME, tagTag);
    072        }
    073
    074        /**
    075         * このカスタムタグの名前を返します。
    076         *
    077         * @return カスタムタグの名前
    078         */
    079        public String getName() {
    080                return NAME;
    081        }
    082
    083        /**
    084         * このカスタムタグのタグ表現を受け取り、
    085         * 文字列としての表現を返し、生成されたページに出力します。
    086         *
    087         * @param tagTag このカスタムタグのタグ表現
    088         *
    089         * @return このタグの文字列としての表現
    090         */
    091        public String toString( final Tag tagTag ) {
    092                return DocletUtil.valueTag( tagTag );
    093        }
    094
    095        /**
    096         * このカスタムタグのタグ表現の配列を受け取り、
    097         * 文字列としての表現を返し、生成されたページに出力します。
    098         * このタグレットがインラインタグを表す場合、
    099         * このメソッドは null を返します。
    100         *
    101         * @param tagTags       このカスタムタグを表すタグの配列
    102         *
    103         * @return このタグの文字列としての表現
    104         */
    105        public String toString( final Tag[] tagTags ) {
    106                if(tagTags.length == 0) {
    107                        return null;
    108                }
    109                StringBuilder result = new StringBuilder();
    110                for(int i = 0; i < tagTags.length; i++) {
    111                        result.append( DocletUtil.valueTag( tagTags[i] ) );
    112                }
    113                return result.toString();
    114        }
    115}