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