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}