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