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}