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;
019
020/**
021 * ソースコメントから、Javadoc を作成する場合のカスタムタグ情報を作成する
022 * Taglet インターフェースのAbstract 実装クラスを作成します。
023 * デフォルトの タグレットとしての初期値を設定します。
024 * つまり、isInlineTag() のみ false を返すメソッドを定義してあります。
025 *
026 * @version  4.0
027 * @author   Kazuhiko Hasegawa
028 * @since    JDK5.0,
029 */
030public abstract class AbstractTaglet implements Taglet {
031
032        /**
033         * このタグレットがフィールドドキュメンテーションで
034         * 使用されている場合、true を返します。
035         * インラインタグについては false が設定されます。
036         *
037         * @return フィールドドキュメンテーションの場合は true、そうでない場合は false を返します
038         */
039        public boolean inField() {
040                return true;
041        }
042
043        /**
044         * このタグレットがコンストラクタドキュメンテーションで
045         * 使用されている場合、true を返します。
046         * インラインタグについては false が設定されます。
047         *
048         * @return コンストラクタドキュメンテーションの場合は true、そうでない場合は false を返します
049         */
050        public boolean inConstructor() {
051                return true;
052        }
053
054        /**
055         * このタグレットがメソッドドキュメンテーションで
056         * 使用されている場合、true を返します。
057         * インラインタグについては false が設定されます。
058         *
059         * @return メソッドドキュメンテーションの場合は true、そうでない場合は false を返します
060         */
061        public boolean inMethod() {
062                return true;
063        }
064
065        /**
066         * このタグレットが概要ドキュメンテーションで
067         * 使用されている場合、true を返します。
068         * インラインタグについては false が設定されます。
069         *
070         * @return 概要ドキュメンテーションの場合は true、そうでない場合は false を返します
071         */
072        public boolean inOverview() {
073                return true;
074        }
075
076        /**
077         * このタグレットがパッケージドキュメンテーションで
078         * 使用されている場合、true を返します。
079         * インラインタグについては false が設定されます。
080         *
081         * @return パッケージドキュメンテーションの場合は true、そうでない場合は false を返します
082         */
083        public boolean inPackage() {
084                return true;
085        }
086
087        /**
088         * このタグレットがタイプドキュメンテーションで
089         * 使用されている場合、true を返します。
090         * インラインタグについては false が設定されます。
091         *
092         * @return タイプドキュメンテーションの場合は true、そうでない場合は false を返します
093         */
094        public boolean inType() {
095                return true;
096        }
097
098        /**
099         * このタグレットがインラインタグで
100         * 使用されている場合、true を返します。
101         * そうでない場合については false が設定されます。
102         *
103         * @return インラインタグの場合は true、そうでない場合は false を返します
104         */
105        public boolean isInlineTag() {
106                return false;
107        }
108
109        /**
110         * このタグレットがインラインタグで {@link XXXX YYYY} を処理するように
111         * 用意された、カスタムメソッドです。
112         *
113         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
114         *
115         * @param       in      オリジナルの文字列
116         *
117         * @return      インラインタグの link を処理した結果の文字列
118         */
119        protected String link( final String in ) {
120                if( in == null ) { return ""; }
121                int index = in.indexOf( "{@link" );
122                if( index < 0 ) { return in; }
123
124                StringBuilder rtn = new StringBuilder();
125                int start = 0;
126                while( index >= 0 ) {
127                        int end = in.indexOf( '}',index );
128
129                        // {@ より前方の文字列を追加
130                        if( index > 0 ) { rtn.append( in.substring( start,index ) ); }
131
132                        // {@link XXXX YY} の XXXX YY部分を処理
133                        String val = in.substring( index+7,end );
134                        if( val != null ) {
135                                int sp = val.indexOf( ' ' );
136                                String xxx = val.substring( 0,sp ).trim();      // 前半:アドレス変換
137                                String yyy = val.substring( sp ).trim();        // 後半:ラベル
138                                String zzz = xxx.replace( '.','/' );
139                                rtn.append( "<a href=\"../../../../" ).append( zzz ).append( ".html\" " )
140                                        .append( "title=\"" ).append( xxx ).append( "\">" )
141                                        .append( yyy ).append( "</a>" );
142                        }
143
144                        start = end+1 ;
145                        index = in.indexOf( "{@",start );
146                }
147                rtn.append( in.substring( start ) );
148
149                return rtn.toString();
150        }
151}