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