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}