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.xml;
017    
018    import org.opengion.fukurou.util.Closer ;
019    import org.opengion.fukurou.util.HybsEntry ;
020    import org.opengion.fukurou.util.FileUtil ;
021    import org.opengion.fukurou.util.StringUtil ;
022    import org.opengion.fukurou.util.LogWriter;
023    import org.opengion.fukurou.util.HybsDateUtil ;
024    
025    import java.io.Reader;
026    import java.io.Writer;
027    import java.io.File;
028    import java.io.IOException;
029    import java.io.StringReader;
030    // import java.text.DateFormat;
031    // import java.text.SimpleDateFormat;
032    // import java.util.Date;
033    // import java.util.Locale;
034    
035    import javax.xml.transform.TransformerException;
036    import javax.xml.transform.TransformerConfigurationException;
037    import javax.xml.transform.TransformerFactory;
038    import javax.xml.transform.Transformer;
039    import javax.xml.transform.stream.StreamSource;
040    import javax.xml.transform.stream.StreamResult;
041    
042    /**
043     * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
044     * 結果は、XML 出力ファイルにセーブしますã?
045     * å�?ƒ•ァイルの代わりに、Writer,Reader を設定することも可能ですã?
046     *
047     * こã?パã?サーでは、å?部で実行中の入力ファイルæƒ??ã‚?パラメータとして設定できますã?
048     * useFileInfo( true ) とセãƒ?ƒˆすると、以下ã??”é?目がå?部çš?�«セãƒ?ƒˆされますã?
049     * ただしã?こã?設定が可能なのは、XML 入力ファイルに、Reader ではなくã?ファイル名を
050     * 渡した場合ã?みですã?ストリーãƒ??場合ã?、各種æƒ??は取れませんã€?
051     *
052     * 入力ファイル(inXMLのフルパス)     : FILEPATH  (ä¾? G:\webapps\gf\jsp\DOC10\query.jsp)
053     * 入力親フォルãƒ?inXMLの親フォルãƒ? : ADDRESS   (ä¾? DOC10)
054     * 入力ファイル(inXMLのファイルå�?   : FILENAME  (ä¾? query.jsp)
055     * 入力ファイル(inXMLの更新日ä»? )   : MODIFIED  (ä¾? yyyyMMddHHmmss形å¼?
056     *
057     * xsl ファイルでは、パラメータ は、xsl:param で宣è¨?�—、xsl:value-of で取り出しますã?
058     * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
059     * <xsl:value-of select="$ADDRESS"     /> とすれば、取得できますã?
060     *
061     *      String inXSTL  = "inXSLfile.xsl" ;   // 入力X?³?¬ファイル
062     *      String outFile = "outXMLfile.xml" ;  // 出力X?­?¬ファイル
063     *      String inXML   = "inXMLfile.xml" ;   // 入力X?­?¬ファイル
064     *
065     *      XSLT xslt = new XSLT();
066     *      xslt.setXslFile( inXSTL );
067     *      xslt.setOutFile( outFile,false );
068     *
069     *      xslt.transform( inXML );
070     *
071     * @version  4.0
072     * @author   Kazuhiko Hasegawa
073     * @since    JDK5.0,
074     */
075    public class XSLT {
076            private static final String CR = System.getProperty("line.separator") ;
077            /** 初期 ENCODE å�?{@value}       */
078            public static final String ENCODE = "UTF-8" ;
079    
080            private Transformer transformer = null;
081    
082            private String          encode          = ENCODE;
083            private String          xmlFile         = null;
084            private String          xslFile         = null;
085            private String          outFile         = null;
086            private Reader          xslReader       = null;
087            private Writer          outWriter       = null;
088            private HybsEntry[] paramEntry  = null;
089            private boolean         isFileInfo      = false;
090            private boolean         isErrClose      = true;
091            private boolean         isErrXmlIn      = false;        // useErrXmlIn â‡?isErrXmlIn 変更
092            private boolean         isInclude       = true;         // 4.2.3.0 (2008/05/26)
093            private StreamResult result = null;
094    
095    //      private DateFormat      formatter       = null;                 // HybsDateUtil を利用
096    
097    //      private String          jspIncludeData  = null;         // 5.6.7.1 (2013/08/09) ローカル変数åŒ?
098            private String          debugMsg                = null;         // 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用
099    
100            /**
101             * 入力XSLファイルをã?æŒ?®šしますã?
102             *
103             * @param       file    入力XSLファイル
104             * @see #setXslFile( Reader )
105             */
106            public void setXslFile( final String file ) {
107                    xslFile = file;
108                    setXslFile( FileUtil.getBufferedReader( new File( xslFile ),encode ) );
109            }
110    
111            /**
112             * 入力XSLリーãƒ??をã?æŒ?®šしますã?
113             *
114             * @param       reader  入力XSLリーãƒ??
115             * @see #setXslFile( String )
116             */
117            public void setXslFile( final Reader reader ) {
118                    transformer = null;
119                    xslReader = reader;
120            }
121    
122            /**
123             * 結果XML ファイル名と、そのオープン方法をæŒ?®šしますã?
124             * 結果XML ファイルをã?追記すã‚?append=true)か新規作æ?する(append=false)か指定しますã?
125             * なおã?結果XML ファイル(outFile) を指定しなã�?=null)かã?特別な名称 "System.out"
126             * æ–?­—å?を渡すと、標準å?力に 結果をå?力しますã?
127             *
128             * @param       file    出力ファイルå�?null またã?ã€?System.out" æ–?­—å?時ã?、標準å?åŠ?
129             * @param append [true]追記すã‚?false:新規作æ?する]
130             */
131            public void setOutFile( final String file,final boolean append ) {
132                    outFile = file ;
133                    setOutFile( FileUtil.getPrintWriter( new File( outFile ),encode,append ) );
134            }
135    
136            /**
137             * 結果XML ãƒ??タをå?力するã?Writer を指定しますã?
138             * ファイル、標準å?力ã?JSPWriter など、å¿?¦�に応じて Writer を作æ?してくださいã€?
139             * 標準å?åŠ?System.out)の場合ã?、NonClosePrintWriter クラスなどの非close()処ç�?³»をã?
140             * JSPWriterの場合ã?、NonFlushPrintWriter クラスなどの非flush()、close()処ç�?³»をã?
141             * 使用してくださいã€?
142             *
143             * @param       writer  出力するWriter
144             */
145            public void setOutFile( final Writer writer ) {
146                    Closer.ioClose( outWriter );
147                    outWriter = writer ;
148                    result = new StreamResult( outWriter );
149            }
150    
151            /**
152             * 結果XML ライターに、指定ã?ãƒ??タを書きå?しますã?
153             *
154             * @param       outData 書きå?すデータ
155             */
156            public void setOutData( final String outData ) {
157                    if( outData != null && outData.length() > 0 ) {
158                            try {
159                                    outWriter.write( outData );
160                                    outWriter.write( CR );
161                            }
162                            catch( IOException ex ) {
163                                    String errMsg = "ライターにãƒ??タ登録を失敗しましたã€? + CR
164                                                                    + ex.getMessage() ;
165                                    close();
166                                    throw new RuntimeException( errMsg,ex );
167                            }
168                    }
169            }
170    
171            /**
172             * XML ファイルをXSLT変換しますã?
173             * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
174             * 結果は、XML ファイルにセーブしますã?
175             * 拡張子がã€?jsp』ã?場合ã?jsp:directive.include 処ç�?‚’行いますã?
176             *
177             * @og.rev 4.0.0.2 (2007/12/10) 拡張子がã€?jsp』ã?場合ã?jsp:directive.include 処ç�?‚’行いますã?
178             *
179             * @param       file    入力XMLファイル
180             * @see #transform( Reader )
181             */
182            public void transform( final String file ) {
183                    transform( file, isInclude );
184            }
185    
186            /**
187             * XML ファイルをXSLT変換しますã?
188             * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
189             * 結果は、XML ファイルにセーブしますã?
190             * 引数の isJspInclude によって、jsp:directive.include 処ç�?‚’行うかどã�?�‹判断しますã?
191             *
192             * @og.rev 4.2.3.0 (2008/05/26) jsp:directive.include 処ç�??実施可否を引数æŒ?®šしますã?
193             * @og.rev 5.2.1.0 (2010/10/01) JspIncludeReader#getString の第?“引数をå»?­¢
194             * @og.rev 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを取得しておきますã?
195             *
196             * @param       file    入力XMLファイル
197             * @param       isJspInclude    jsp:directive.include 処ç�?‚’行うかどã�?�‹ã€?
198             * @see #transform( Reader )
199             */
200            public void transform( final String file, final boolean isJspInclude ) {
201                    xmlFile = file;
202    
203                    if( xmlFile.endsWith( ".jsp" ) && isJspInclude ) {
204    //              if( xmlFile.endsWith( ".jsp" ) ) {
205    //                      transform( new JspIncludeReader().getReader( new File( xmlFile ),encode ) );
206    //                      jspIncludeData = new JspIncludeReader().getString( new File( xmlFile ),encode,false );
207    //                      jspIncludeData = new JspIncludeReader().getString( new File( xmlFile ),encode );                // 5.2.1.0 (2010/10/01)
208    
209                            // 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを取得しておきますã?
210                            JspIncludeReader jspIncReader = new JspIncludeReader();
211                            debugMsg = jspIncReader.getIncludeFiles();
212    
213                            String jspIncludeData = jspIncReader.getString( new File( xmlFile ),encode );                   // 5.2.1.0 (2010/10/01)
214                            transform( new StringReader( jspIncludeData ) );
215                    }
216                    else {
217                            transform( FileUtil.getBufferedReader( new File( xmlFile ),encode ) );
218                    }
219            }
220    
221            /**
222             * XML ファイルをXSLT変換しますã?
223             * XML 入力リーãƒ??に、XSL 入力リーãƒ??を適用してã€?XSLT変換を行いますã?
224             * 結果は、XML ライターに書きå?しますã?
225             * こã?処ç�??終äº?¾Œに、å?力XML リーãƒ?? は、close() されますã?
226             *
227             * @og.rev 5.6.5.2 (2013/06/21) エラーメãƒ?‚»ージが判りにくいので、追記しますã?
228             * @og.rev 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを出力しますã?
229             *
230             * @param       xmlReader       入力XML リーãƒ??
231             * @see #transform( String )
232             */
233            public void transform( final Reader xmlReader ) {
234                    HybsEntry[] entry = null;
235    
236                    try {
237                            if( transformer == null ) {
238                                    init();
239                            }
240                            else {
241                                    transformer.reset();
242                            }
243    
244                            // 入力XMLファイルのファイルæƒ??を設定しますã?
245                            if( isFileInfo && xmlFile != null ) {
246                                    entry = getXmlParameter( xmlFile );
247                                    parameterSet( transformer,entry );
248                            }
249                            xmlFile = null ;
250    
251                            // 入力XMLリーãƒ??からStreamSourceを作る
252                            StreamSource data = new StreamSource( xmlReader );
253    
254                            transformer.transform( data,result );
255                    }
256                    catch( TransformerException ex ) {
257                            // 5.7.3.0 (2014/02/07) エラーæƒ??をもã�?°‘し詳細に取得しますã?
258                            StringBuilder errBuf = new StringBuilder();
259    //                      String errMsg = "XML-XSLT 変換に失敗しましたã€? + CR
260    //                                                              + ex.getMessage() ;
261                            String errMsg = ex.getMessageAndLocation() ;
262    
263                            errBuf.append( "XML-XSLT 変換に失敗しましたã€? ).append( CR ).append( errMsg );
264    
265                            // 5.6.5.2 (2013/06/21) エラーメãƒ?‚»ージが判りにくいので、追記しますã?
266                            if( errMsg.indexOf( "プロローグにはコンãƒ?ƒ³ãƒ?‚’æŒ?®šできません" ) >= 0 ) {
267    //                              errMsg = errMsg + CR + "(UTF-8変換時に、BOMが付くとこã?エラーがå?ますã?BOMを外してみてくださいã€?" ;
268                                    errBuf.append( CR ).append( "(UTF-8変換時に、BOMが付くとこã?エラーがå?ますã?BOMを外してみてくださいã€?" );
269                            }
270    
271                            // 5.6.7.1 (2013/08/09) ãƒ?ƒ�ãƒ?‚°用に、ファイルリストを出力しますã?
272                            if( errMsg.indexOf( "で終äº?�™るå¿?¦�がありまã�? ) >= 0 && debugMsg != null && debugMsg.length() > 0 ) {
273    //                              errMsg = errMsg + CR + "不整合ã?、includeファイルの可能性がありますã?" + debugMsg;
274                                    errBuf.append( CR ).append( "不整合ã?、includeファイルの可能性がありますã?" ).append( debugMsg );
275                            }
276                            errBuf.append( CR );
277    
278                            if( isErrXmlIn ) { setOutData( toXmlRow( entry, ex ) ); }
279    
280                            if( isErrClose ) { close(); }
281    //                      throw new RuntimeException( errMsg,ex );
282                            throw new RuntimeException( errBuf.toString(),ex );
283                    }
284                    finally {
285                            Closer.ioClose( xmlReader );
286                    }
287            }
288    
289            /**
290             * Transformer オブジェクトに対して、Parameter を設定しますã?
291             *
292             * æŒ?®šされたパラメーターキーは、xsl ファイルでは、xsl:param で宣è¨?�—ã€?
293             * xsl:value-of で取り出しますã?
294             * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
295             * <xsl:value-of select="$ADDRESS"     /> とすれば、取得できますã?
296             *
297             * @param       entry   HybsEntry配å?
298             */
299            public void setParamEntry( final HybsEntry[] entry ) {
300                    if( entry != null && entry.length > 0 ) {
301                            paramEntry = new HybsEntry[entry.length];
302                            System.arraycopy( entry,0,paramEntry,0,entry.length );
303                    }
304            }
305    
306            /**
307             * transform 処ç�?¸­にエラーが発生したå?合に、å?力ファイルを閉じるかどã�?�‹を指定しますã?
308             *
309             * 処ç�??中でエラーが発生したå?合に、そこで処ç�?‚’中断するかã?それともã?
310             * 無視して、さらに処ç�?‚’進めるかをæŒ?®šすることが可能ですã?
311             * 継続して処ç�?‚’進めたã�??合ã?、å?力ファイルを閉じなã�?�Ÿめã?false ã‚?
312             * 設定しますã?ただしã?エラー時には、RuntimeException は throw されますã?
313             * 初期値は、true(閉じã‚?ですã?
314             *
315             * @param       flag    エラー時クローズ [true:閉じã‚?false:閉じない]
316             */
317            public void errClose( final boolean flag ) {
318                    isErrClose = flag ;
319            }
320    
321            /**
322             * transform 処ç�?¸­エラーをã?出力ファイルに、XML形式でエラーを追記するかどã�?�‹を指定しますã?
323             *
324             * 処ç�??中でエラーが発生したå?合に、ログã�?�‘ではなくã?結果XMLファイルにã€?
325             * エラーå†?®¹ã‚??エラーファイルなどを埋め込ã‚?�¨、XMLファイルとしてDB登録ã‚??
326             * そã?他集計等に使えますã?
327             * 今ã?、GE70 スキーマ形式ã?ファイルしか作æ?できませんã€?
328             * これはã€?errClose( boolean ) メソãƒ?ƒ‰と共に使用すると効果的ですã?
329             * つまりã?errClose = false; にして、エラー時でもå?力ファイルを閉じずにã€?
330             * 処ç�?‚’続ける事で、エラーメãƒ?‚»ージもXMLファイルとしてè“?©�できますã?
331             * 初期値は、false(使用しなã�?ですã?
332             *
333             * @param       flag    エラー時XML形å¼?[false:使用しなã�?true:使用する]
334             */
335            public void useErrXmlIn( final boolean flag ) {
336                    isErrXmlIn = flag ;
337            }
338    
339            /**
340             * jsp:directive.include 発見時に、そのファイルã‚?INCLUDE するかをæŒ?®šするかどã�?�‹を指定しまã�?初期値:true:使用する)
341             *
342             * 引数の処ç�?¯¾象ファイル(transformの引数ファイル)がã?ã€?jsp』ã?場合ã?
343             * jsp:directive.include 発見時に、そのファイルã‚?INCLUDE するかをæŒ?®šするか
344             * どã�?�‹を指定しますã?
345             * インクルードされたファイルとあわせて、正規ã?XML にならなã�?�¨、パーサー
346             * エラーが発生しますã?
347             * JSPソース解析を行うには、INCLUDE ファイルもè?慮しなã�?�¨正確な結果ã‚?
348             * 得られませんがã?INCLUDE 先ã?ファイルまで合わせるå¿?¦�があるためã€?
349             * 場合によっては、INCLUDEファイルを無視しなければならなã�?‚±ースがありますã?
350             * 初期値は、true(使用する)ですã?
351             *
352             * @param       flag    エラー時XML形å¼?[false:使用しなã�?true:使用する]
353             */
354            public void jspInclude( final boolean flag ) {
355                    isInclude = flag ;
356            }
357    
358            /**
359             * 入力XSLファイルのストリーãƒ?‚’閉じますã?
360             *
361             * @og.rev 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリアしますã?
362             */
363            public void close() {
364                    Closer.ioClose( outWriter );
365    
366                    // 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリア
367                    JspIncludeReader.cacheClear();
368            }
369    
370            /**
371             * XML ファイルをXSLT変換しますã?
372             * XML 入力ファイルに、XSL 入力ファイルを適用してã€?XSLT変換を行いますã?
373             * 結果は、XML ファイルにセーブしますã?
374             * なおã?結果XML ファイル(outFile) に、特別な名称 "System.out" æ–?­—å?を渡すとã€?
375             * 標準å?力に 結果をå?力しますã?
376             *
377             * @og.rev 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリアしますã?
378             */
379            private void init() {
380                    try {
381                            // xsl属æ?からStreamSourceを作る
382                            StreamSource style = new StreamSource( xslReader );
383    
384                            // Transformerを作り、XMLを変換する
385                            TransformerFactory tFactory = TransformerFactory.newInstance();
386                            transformer = tFactory.newTransformer( style );
387    
388                            parameterSet( transformer,paramEntry );
389    
390                            // 5.6.7.1 (2013/08/09) includeしたファイルのキャãƒ?‚·ュをクリア
391                            JspIncludeReader.cacheClear();
392                    }
393                    catch( TransformerConfigurationException ex ) {
394                            String errMsg = xslFile + "ファイルの XSLT 解析に失敗しましたã€? + CR
395                                                                    + ex.getMessage() ;
396                            throw new RuntimeException( errMsg,ex );
397                    }
398                    finally {
399                            Closer.ioClose( xslReader );
400                            xslReader = null;
401                    }
402            }
403    
404            /**
405             * 実行中の入力ファイル名などの属æ?æƒ??ã‚?パラメータとして設定するかどã�?�‹を指定しますã?
406             *
407             * こã?パã?サーでは、å?部で実行中の入力ファイルæƒ??ã‚?パラメータとして設定できますã?
408             * useFileInfo( true ) とセãƒ?ƒˆすると、以下ã??”é?目がå?部çš?�«セãƒ?ƒˆされますã?
409             *
410             * 入力ファイル(inXMLのフルパス)     : FILEPATH  (ä¾? G:\webapps\gf\jsp\DOC10\query.jsp)
411             * 入力親フォルãƒ?inXMLの親フォルãƒ? : ADDRESS   (ä¾? DOC10)
412             * 入力ファイル(inXMLのファイルå�?   : FILENAME  (ä¾? query.jsp)
413             * 入力ファイル(inXMLの更新日ä»? )   : MODIFIED  (ä¾? yyyyMMddHHmmss形å¼?
414             *
415             * @og.rev 4.0.0.0 (2007/09/25) ParameterMetaData を使用したパラメータ設定追åŠ??
416             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
417             *
418             * xsl ファイルでは、xsl:param で宣è¨?�—、xsl:value-of で取り出しますã?
419             * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
420             * <xsl:value-of select="$ADDRESS"     /> とすれば、取得できますã?
421             *
422             * 初期値は、false(セãƒ?ƒˆしなã�? ですã?
423             *
424             * @param       flag    セãƒ?ƒˆする:true/セãƒ?ƒˆしなã�?false
425             */
426            public void useFileInfo( final boolean flag ) {
427                    isFileInfo = flag;
428    //              if( isFileInfo ) {
429    //                      formatter = new SimpleDateFormat( "yyyyMMddHHmmss",Locale.JAPAN );
430    //              }
431            }
432    
433            /**
434             * ファイル名指定で XML,XSL,OUTファイルを指定するå?合ã?エンコードをæŒ?®šしますã?
435             *
436             * 初期値は、UTF-8 ですã?
437             *
438             * @param       encode  エンコーãƒ?
439             */
440            public void useEncode( final String encode ) {
441                    this.encode = encode;
442            }
443    
444            /**
445             * 実行中の入力ファイル名などの属æ?æƒ??ã‚?パラメータとして取得しますã?
446             *
447             * 入力ファイル(inXMLのフルパス)     : FILEPATH  (ä¾? G:\webapps\gf\jsp\DOC10\query.jsp)
448             * 入力ファイル(inXMLのファイルå�?   : FILENAME  (ä¾? query.jsp)
449             * 入力親フォルãƒ?inXMLの親フォルãƒ? : ADDRESS   (ä¾? DOC10)
450             * 入力ファイル(inXMLの更新日ä»? )   : MODIFIED  (ä¾? yyyyMMddHHmmss形å¼?
451             *
452             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
453             *
454             * @param       xmlIn   XML入力ファイル
455             *
456             * @return      HybsEntry配å?
457             */
458            private HybsEntry[] getXmlParameter( final String xmlIn ) {
459                    HybsEntry[] entry = new HybsEntry[4] ;
460    
461                    entry[0] = new HybsEntry( "FILEPATH" , xmlIn) ;
462    
463                    File xmlFile = new File( xmlIn );
464                    entry[1] = new HybsEntry( "FILENAME" , xmlFile.getName()) ;
465    
466                    File parentFile = xmlFile.getParentFile() ;
467                    if( parentFile != null ) {
468                            entry[2] = new HybsEntry( "ADDRESS"  , parentFile.getName()) ;
469                    }
470                    else {
471                            entry[2] = new HybsEntry( "ADDRESS"  , "" ) ;
472                    }
473    
474    //              String lastDate = formatter.format( new Date( xmlFile.lastModified() ) ) ;
475                    String lastDate = HybsDateUtil.getDate( xmlFile.lastModified() , "yyyyMMddHHmmss" ) ;           // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
476                    entry[3] = new HybsEntry( "MODIFIED" , lastDate ) ;
477    
478                    return entry ;
479            }
480    
481            /**
482             * Transformer オブジェクãƒ?に、パラメータを設定しますã?
483             *
484             * æŒ?®šされたパラメーターキーは、xsl ファイルでは、xsl:param で宣è¨?�—ã€?
485             * xsl:value-of で取り出しますã?
486             * <xsl:param name="ADDRESS" select="" /> と宣è¨?�—ておき、å¿?¦�なç®?‰€で
487             * <xsl:value-of select="$ADDRESS"     /> とすれば、取得できますã?
488             *
489             * @param former Transformerオブジェクãƒ?
490             * @param entry  パラメータ配å?
491             */
492            private void parameterSet( final Transformer former,final HybsEntry[] entry ) {
493                    if( entry != null ) {
494                            int size   = entry.length;
495                            for( int i=0; i<size; i++ ) {
496                                    String key = entry[i].getKey() ;
497                                    String val = entry[i].getValue();
498                                    former.setParameter( key , val );
499                            }
500                    }
501            }
502    
503            /**
504             * こã?オブジェクトã?å†?ƒ¨æ–?­—å?表現を返しますã?
505             *
506             * 接続URL + "," + 接続ユーザー + " (" + 作æ?日ä»?+ ")" ですã?
507             *
508             * @return å†?ƒ¨æ–?­—å?表現
509             */
510            @Override
511            public String toString() {
512                    StringBuilder buf = new StringBuilder();
513    
514                    buf.append( "XSL File:" ).append( xslFile ).append( CR );
515                    buf.append( "XML File:" ).append( xmlFile ).append( CR );
516                    buf.append( "OUT File:" ).append( outFile ).append( CR );
517    
518                    return buf.toString() ;
519            }
520    
521            /**
522             * エラーæƒ??のå†?ƒ¨XMLæ–?­—å?表現を返しますã?
523             *
524             * エラー時ã?æƒ??もã?XML化して保存する為の簡易å?ç�??
525             * ここでは、XMLスキーマã?、固定で、GF70 の形式になりますã?
526             *
527             * @og.rev 4.2.3.0 (2008/05/26) エラー発生時のXMLファイルを追åŠ?�—ますã?
528             * @og.rev 5.2.1.0 (2010/10/01) XML形式を変更しますã?(TEXT⇒TEXT_DATA)
529             *
530             * @param       entry   HybsEntry配å?
531             * @param       ex              エラーæƒ??
532             *
533             * @return XMLの部åˆ?–‡字å?
534             */
535            private String toXmlRow( final HybsEntry[] entry,final TransformerException ex ) {
536                    StringBuilder buf = new StringBuilder();
537    
538                    buf.append( "<ROW>" ).append( CR );
539                    if( paramEntry != null ) {
540                            for( int i=0; i<paramEntry.length; i++ ) {
541                                    String key = paramEntry[i].getKey() ;
542                                    String val = paramEntry[i].getValue();
543                                    buf.append( "  <" ).append( key ).append( ">" );
544                                    buf.append( val );
545                                    buf.append( "</" ).append( key ).append( ">" );
546                                    buf.append( CR );
547                            }
548                    }
549    
550                    if( entry != null ) {
551                            for( int i=0; i<entry.length; i++ ) {
552                                    String key = entry[i].getKey() ;
553                                    String val = entry[i].getValue();
554                                    buf.append( "  <" ).append( key ).append( ">" );
555                                    buf.append( val );
556                                    buf.append( "</" ).append( key ).append( ">" );
557                                    buf.append( CR );
558                            }
559                    }
560    
561                    buf.append( "  <TAGNAME />" ).append( CR );
562                    buf.append( "  <MSGCD>XML_ERROR</MSGCD>" ).append( CR );
563                    buf.append( "  <MSGTXT>XML-XSLT 変換に失敗しましたã€?/MSGTXT>" ).append( CR );
564    
565                    String errMsg = StringUtil.htmlFilter( ex.getMessage() );
566                    int indx = errMsg.lastIndexOf( "Exception:" );
567                    if( indx >= 0 ) {
568                            errMsg = errMsg.substring( indx + "Exception:".length() );
569                    }
570                    buf.append( "  <TEXT_DATA>" ).append( errMsg ).append( CR );              // 5.2.1.0 (2010/10/01)
571                    buf.append( " Location:" ).append( ex.getLocationAsString() ).append( CR );
572    
573                    // 4.2.3.0 (2008/05/26)
574            //      if( jspIncludeData != null ) {
575            //              buf.append( StringUtil.htmlFilter( jspIncludeData ) );
576            //      }
577    
578                    buf.append( "</TEXT_DATA>" ).append( CR );                // 5.2.1.0 (2010/10/01)
579                    buf.append( "</ROW>" ).append( CR );
580    
581                    return buf.toString() ;
582    
583    /*
584               <ROW>
585                     <SYSTEM_ID>  </SYSTEM_ID>
586                     <ADDRESS  >  </ADDRESS>
587                     <FILENAME >  </FILENAME>
588                     <FILEPATH >  </FILEPATH>
589                     <MODIFIED >  </MODIFIED>
590                     <TAGNAME  >  </TAGNAME>
591                     <MSGCD    >  </MSGCD>
592                     <MSGTXT   >  </MSGTXT>
593                     <TEXT_DATA>  </TEXT_DATA>
594               </ROW>
595    */
596            }
597    
598            /**
599             * ãƒ?‚¹ト用のメインメソãƒ?ƒ‰
600             *
601             * java XSLT in_xml in_xsl out_xml
602             *
603             * @param       args    コマンド引数配å?
604             * @throws IOException 入出力エラーが発生したå?å�?
605             */
606            public static void main( final String[] args ) throws IOException {
607                    if( args.length != 3 ) {
608                            LogWriter.log( "Usage: java XSLT in_xml in_xsl out_xml" );
609                            LogWriter.log( "  XML 入力ファイルに、XSL 入力ファイルを適用してã€? );
610                            LogWriter.log( "  XSLT変換を行いますã?" );
611                            LogWriter.log( "  結果は、XML ファイルにセーブしますã?" );
612                            LogWriter.log( "  out_xml に System.out を指定すると標準å?力に出力しますã?" );
613                            return ;
614                    }
615    
616                    XSLT xslt = new XSLT();
617                    xslt.setXslFile( args[1] );
618                    xslt.setOutFile( args[2],false );
619                    xslt.transform( args[0] );
620                    xslt.close();
621            }
622    }