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 */
016 package org.opengion.fukurou.taglet;
017
018 import org.opengion.fukurou.util.LogWriter;
019 import org.opengion.fukurou.util.StringUtil;
020
021 import com.sun.javadoc.RootDoc;
022 import com.sun.javadoc.ClassDoc;
023 import com.sun.javadoc.FieldDoc;
024 import com.sun.javadoc.Tag;
025 import java.io.IOException;
026
027 /**
028 * ソースコメントから?パラメータ??を取り??Doclet クラスです?
029 * og.paramLevel タグと og.cryptography タグを?り?します?
030 * これら?????パラメータとしてGE12???゙ルに設定される値をクラスより抽出する
031 * のに使用します?
032 *
033 * @version 4.0
034 * @author Kazuhiko Hasegawa
035 * @since JDK5.0,
036 */
037 public final class DocletParam {
038 private static final String OG_PARAM_LVL = "og.paramLevel";
039 private static final String OG_CRYPTOGRAPHY = "og.cryptography";
040 private static final String ENCODE = "UTF-8";
041 private static final int CNST = 1000;
042
043 /**
044 * すべて?staticメソ?なので、コンストラクタを呼び出さなくしておきます?
045 *
046 */
047 private DocletParam() {}
048
049 /**
050 * Doclet のエントリポイントメソ?です?
051 *
052 * @og.rev 5.5.2.0 (2012/05/01) systemIdのbuild.xmlの引数が?** の場合にエラーになるため?対?
053 * @og.rev 5.7.1.1 (2013/12/13) タグのイン?トを止める?
054 *
055 * @param root ドキュメントルートオブジェク?
056 *
057 * @return 正常実行時 true
058 */
059 public static boolean start( final RootDoc root ) {
060 String systemId = DocletUtil.getOption( "-systemId" , root.options() );
061 String file = DocletUtil.getOption( "-outfile" , root.options() );
062
063 if( systemId == null || systemId.isEmpty() ) { systemId = "**"; } // 5.5.2.0 (2012/05/01)
064
065 DocletTagWriter writer = null;
066 try {
067 writer = new DocletTagWriter( file,ENCODE );
068
069 // 5.7.1.1 (2013/12/13) タグのイン?トを止める?
070 writer.printTag( "<?xml version=\"1.0\" encoding=\"", ENCODE, "\" ?>" );
071 writer.printTag( "<javadoc>" );
072 writer.printTag( "<systemId>",systemId,"</systemId>" );
073 writeContents( root.classes(),writer );
074 writer.printTag( "</javadoc>" );
075 }
076 catch( IOException ex ) {
077 LogWriter.log( ex );
078 }
079 finally {
080 if( writer != null ) { writer.close(); }
081 }
082 return true;
083 }
084
085 /**
086 * ClassDoc 配?よりコン??作?します?
087 *
088 * @og.rev 5.5.4.1 (2012/07/06) コメント???でなく?Tag配?として処?せる?
089 * @og.rev 5.5.4.1 (2012/07/06) DocletUtil.htmlFilter ?StringUtil.htmlFilter に変更
090 * @og.rev 5.7.1.1 (2013/12/13) タグのイン?トを止める?
091 *
092 * @param classes ClassDoc配?
093 * @param writer DocletTagWriterオブジェク?
094 */
095 private static void writeContents( final ClassDoc[] classes,final DocletTagWriter writer ) {
096 for(int i=0; i< classes.length; i++) {
097 ClassDoc classDoc = classes[i] ;
098 FieldDoc[] fields = classDoc.fields();
099
100 for( int j=0; j<fields.length; j++ ) {
101 FieldDoc field = fields[j];
102 String param = field.constantValueExpression() ;
103 if( param != null && param.length() >=2 &&
104 param.charAt(0) == '"' && param.charAt( param.length()-1 ) == '"' ) {
105 param = param.substring( 1,param.length()-1 );
106 }
107 // param = DocletUtil.htmlFilter( param );
108 param = StringUtil.htmlFilter( param ); // 5.5.4.1 (2012/07/06) DocletUtil ?StringUtil に変更
109
110 String paramId = field.name();
111 String seq = String.valueOf(j*10 + CNST);
112 Tag[] title = field.firstSentenceTags();
113 // String cmnt = DocletUtil.commentText( field.commentText() ); // 5.5.4.1 (2012/07/06)
114 Tag[] cmnt = field.inlineTags(); // 5.5.4.1 (2012/07/06)
115 Tag[] paramLvl = field.tags(OG_PARAM_LVL);
116 Tag[] fgcrypt = field.tags(OG_CRYPTOGRAPHY);
117
118 // 5.7.1.1 (2013/12/13) タグのイン?トを止める?
119 writer.printTag( "<fieldDoc>" );
120 writer.printTag( "<paramId>" ,paramId ,"</paramId>" );
121 writer.printTag( "<seq>" ,seq ,"</seq>" );
122 writer.printTag( "<param>" ,param ,"</param>" );
123 writer.printTag( "<title>" ,title ,"</title>" );
124 writer.printTag( "<contents>" ,cmnt ,"</contents>" );
125 writer.printChar( "<paramLevel>" ,paramLvl ,"</paramLevel>" );
126 writer.printChar( "<fgcrypt>" ,fgcrypt ,"</fgcrypt>" );
127 writer.printTag( "</fieldDoc>" );
128 }
129
130 }
131 }
132
133 /**
134 * カスタ?プションを使用するドックレ?の??メソ? optionLength(String) です?
135 *
136 * ドックレ?に認識させる?スタ?プションに?optionLength がその
137 * オプションを構?する要?(ト?クン) の数を返さなければなりません?
138 * こ?カスタ?プションでは?-tag オプションそ?も?と
139 * そ?値の 2 つの要?構?される?で、作?するドックレ?の
140 * optionLengthメソ?は?-tag オプションに対して 2 を返さなくては
141 * なりません。また?認識できな?プションに対しては? を返します?
142 *
143 * @param option オプション??
144 *
145 * @return 要?(ト?クン) の数
146 */
147 public static int optionLength( final String option ) {
148 if(option.equalsIgnoreCase("-outfile")) {
149 return 2;
150 }
151 else if(option.equalsIgnoreCase("-systemId")) {
152 return 2;
153 }
154 return 0;
155 }
156 }