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