チェンジセット 399

差分発生行の前後
無視リスト:
コミット日時:
2009/05/10 00:36:21 (13 年前)
コミッタ:
enomoto
ログメッセージ:

im-jssp-emptytagより、emptytag対応部分のmerge.

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/im-jssp/src/main/java/org/intra_mart/jssp/view/ViewScope.java

    r13 r399  
    1010import java.util.NoSuchElementException; 
    1111 
    12 import org.intra_mart.jssp.util.config.JSSPConfigHandlerManager; 
    1312import org.intra_mart.jssp.view.tag.ImartTagAnalyzer; 
    1413import org.mozilla.javascript.Context; 
     
    1615import org.mozilla.javascript.Scriptable; 
    1716 
     17/** 
     18 * HTMLソースを解析します. 
     19 * 
     20 */ 
    1821public class ViewScope implements Serializable { 
    1922 
    20         private Collection<Object> element = new ArrayList<Object>();   // 構成要素群 
    21  
    22         /** 
    23          * @param in HTML ソース(Unicode) 
    24          */ 
    25         public ViewScope(Reader in){ 
     23        /** 空ViewScope */ 
     24        public static final ViewScope EMPTY = new ViewScope.NullViewScope(); 
     25 
     26        // TAG_NAMEを修正する事により、テンプレート上に記述するタグ名を変更する事が可能です. 
     27        // タグ名は大文字, 小文字に対応しています、TAG_NAMEに定義するタグ名は小文字で指定してください. 
     28        // <IMART type="... /> -> <EXTRA type="... /> 
     29        /** タグ名 */ 
     30        public static final String TAG_NAME = "imart"; 
     31 
     32        /** 構成要素群 */ 
     33        private final Collection<Object> element = new ArrayList<Object>(); 
     34 
     35        /** 
     36         * コンストラクタ.<br /> 
     37         *  
     38         * @param in HTMLソース(Unicode) 
     39         */ 
     40        public ViewScope(final Reader in){ 
    2641                super();        // スーパークラスのコンストラクタの呼び出し 
    2742                analyze(in);    // ソース解析 
     
    2944 
    3045        /** 
    31          * @param in 
    32          * @return 
    33          */ 
    34         private Collection analyze(Reader in){ 
    35                 CharArrayWriter token = new CharArrayWriter();           
    36                  
     46         * HTMLソースの解析を行います.<br /> 
     47         * 解析結果イメージ(順序はHTMLソースに依存します.)<br/ > 
     48         * <pre> 
     49         * ViewScope 
     50         *  ├ char[]..: IMARTタグ以外のソース部分 
     51         *  └ ImartTagAnalyzer..: IMARTタグ部分 
     52         *      └ inner@ViewScope..: IMARTタグ内部のソース部分 
     53         *          ├ char[]..: IMARTタグ以外のソース部分 
     54         *          └ ImartTagAnalyzer..: IMARTタグ部分... 
     55         * </pre> 
     56         *  
     57         * @param in HTMLソース. 
     58         */ 
     59        protected void analyze(final Reader in){ 
     60                final CharArrayWriter token = new CharArrayWriter();             
     61 
    3762                int chr; 
    3863 
     
    4166                        while((chr = in.read()) != -1){ 
    4267                                if(chr == (int)'<'){ 
    43                                         if(isImartStTag(in)){ 
     68                                        if(isStartTag(in)){ 
    4469                                                // <IMART> タグ発見!! 
    4570                                                element.add(token.toCharArray()); 
     
    4772                                                element.add(new ImartTagAnalyzer(in)); 
    4873                                        } 
    49                                         else if(isImartEdTag(in)){ 
     74                                        else if(isEndTag(in)){ 
    5075                                                // </IMART> タグ発見!! 
    5176                                                while((chr = in.read()) != -1){ 
     
    6388                                                        } 
    6489                                                } 
    65                                                 // 検索ループの終了 
     90                                                // 検索ループの終了: </IMART>以降のトークンは親のImartTagAnalyzer/ViewScopeが保持 
    6691                                                break; 
    6792                                        } 
     
    76101                                } 
    77102                        }       // End of While 
    78 //                      in.close();             // Reader の閉鎖 
    79                 } 
    80                 catch(IOException ioe){ 
     103                } 
     104                catch(final IOException ioe){ 
    81105                } 
    82106                if(token.size() > 0){ 
     
    84108                        element.add(token.toCharArray()); 
    85109                } 
    86  
    87                 return element; 
    88         } 
    89  
    90          
    91         /** 
    92          * @param in 
    93          * @return 
    94          */ 
    95         private boolean isImartStTag(Reader in){ 
    96                 StringBuffer tag = new StringBuffer(); 
     110        } 
     111 
     112        /** 
     113         * IMART開始タグであるか判定を行います.<br /> 
     114        * このメソッドは引数inのpositionを変更しません. 
     115        *  
     116         * @param in HTMLソース 
     117         * @return 判定結果 true: 開始タグ/false: 開始タグではない 
     118         */ 
     119        private boolean isStartTag(final Reader in){ 
     120                final StringBuilder tag = new StringBuilder(); 
    97121                char chr; 
    98122                boolean bRes = false; 
    99123 
     124                final int LENGTH = TAG_NAME.length(); 
     125                 
    100126                try{ 
    101                         in.mark(Integer.MAX_VALUE);     // 現在位置にマーキング 
    102                         // 文字列の抽出 
    103                         tag.append((char)in.read());    // I 
    104                         tag.append((char)in.read());    // M 
    105                         tag.append((char)in.read());    // A 
    106                         tag.append((char)in.read());    // R 
    107                         tag.append((char)in.read());    // T 
     127                        in.mark(LENGTH);        // 現在位置にマーキング 
     128                        // 文字列の抽出 I M A R T 
     129                        for(int i = 0; i < LENGTH; i++) { 
     130                                tag.append((char)in.read()); 
     131                        } 
     132 
    108133                        chr = (char)in.read(); 
    109134 
    110135                        // チェック 
    111                         bRes = tag.toString().toLowerCase().equals("imart") && Character.isWhitespace(chr); 
    112                 } 
    113                 catch(IOException ioe){ 
     136                        bRes = tag.toString().toLowerCase().equals(TAG_NAME) && Character.isWhitespace(chr); 
     137                } 
     138                catch(final IOException ioe){ 
    114139                        // 何もしない 
    115140                } 
     
    118143                                in.reset(); 
    119144                        } 
    120                         catch(IOException ioe){ 
     145                        catch(final IOException ioe){ 
    121146                                // 何もしない 
    122147                        } 
     
    128153 
    129154        /** 
    130          * @param in 
    131          * @return 
    132          */ 
    133         private boolean isImartEdTag(Reader in){ 
    134                 StringBuffer tag = new StringBuffer(); 
     155         * IMART終了タグであるか判定を行います.<br /> 
     156         * このメソッドは引数inのpositionを変更しません. 
     157         *  
     158         * @param in HTMLソース 
     159         * @return 判定結果 true: 終了タグ/false: 終了タグではない 
     160         */ 
     161        private boolean isEndTag(final Reader in){ 
     162 
     163                final StringBuilder tag = new StringBuilder(); 
    135164                char chr; 
    136165                boolean bRes = false; 
    137166 
     167                final String END_TAG_NAME = "/" + TAG_NAME; 
     168                final int LENGTH = END_TAG_NAME.length();  
     169                 
    138170                try{ 
    139                         in.mark(Integer.MAX_VALUE);   // 現在位置にマーキング 
     171                        in.mark(LENGTH);      // 現在位置にマーキング 
    140172                        // 文字列の抽出 
    141                         tag.append((char)in.read());    // / 
    142                         tag.append((char)in.read());    // I 
    143                         tag.append((char)in.read());    // M 
    144                         tag.append((char)in.read());    // A 
    145                         tag.append((char)in.read());    // R 
    146                         tag.append((char)in.read());    // T 
     173                        for(int i = 0; i < LENGTH; i++) { 
     174                                // / I M A R T 
     175                                tag.append((char)in.read()); 
     176                        } 
     177 
    147178                        chr = (char)in.read(); 
    148179 
    149                         // チェック 
    150                         bRes = tag.toString().toLowerCase().equals("/imart") && (Character.isWhitespace(chr) || chr == '>'); 
    151                 } 
    152                 catch(IOException ioe){ 
     180                        // チェック "/IMART " or "/IMART>"  
     181                        bRes = tag.toString().toLowerCase().equals(END_TAG_NAME) && (Character.isWhitespace(chr) || chr == '>'); 
     182                } 
     183                catch(final IOException ioe){ 
    153184                        // 何もしない 
    154185                } 
     
    157188                                in.reset(); 
    158189                        } 
    159                         catch(IOException ioe){ 
     190                        catch(final IOException ioe){ 
    160191                                // 何もしない 
    161192                        } 
     
    165196                return bRes; 
    166197        } 
    167  
    168198 
    169199        /** 
     
    176206         * @throws IOException 
    177207         */ 
    178         public String execute(Context cx, Scriptable scope) throws JavaScriptException, IOException{ 
    179                 Iterator iterator = element.iterator();       // 要素の抽出(データ) 
    180                 CharArrayWriter out = new CharArrayWriter(); 
     208        public String execute(final Context cx, final Scriptable scope) throws JavaScriptException, IOException{ 
     209                final Iterator iterator = element.iterator(); // 要素の抽出(データ) 
     210                final CharArrayWriter out = new CharArrayWriter(); 
    181211 
    182212                while(iterator.hasNext()){ 
    183                         Object data = iterator.next(); 
     213                        final Object data = iterator.next(); 
    184214 
    185215                        if(data instanceof ImartTagAnalyzer){ 
     
    198228 
    199229        /** 
     230         * デバッグ用に解析結果をSystem.outへ出力します. 
    200231         *  
    201232         */ 
    202233        public void print(){ 
    203                 Iterator iterator = element.iterator(); 
     234                final Iterator iterator = element.iterator(); 
    204235                Object data; 
    205236                java.lang.System.out.print("[element:" + element.size() + "]"); 
     
    209240                                data = iterator.next(); 
    210241                                // セパレータ出力 
    211                                 java.lang.System.out.println("[" + hashCode() + "][" + data.hashCode() + "]-------------------------------------------------"); 
    212                                 if(data instanceof String){ 
    213                                         java.lang.System.out.print(((String) data)); 
    214                                 } 
    215                                 else{ 
     242                                System.out.println("[" + hashCode() + "][" + data.hashCode() + "]-------------------------------------------------"); 
     243                                if(data instanceof char[]) { 
     244                                        System.out.print(new String((char[]) data)); 
     245                                } else if(data instanceof ImartTagAnalyzer) { 
    216246                                        ((ImartTagAnalyzer) data).print(); 
    217247                                } 
    218248                        } 
    219                         catch(NoSuchElementException nsee){ 
     249                        catch(final NoSuchElementException nsee){ 
    220250                                // nothing 
    221251                        } 
     
    223253        } 
    224254 
     255        /** 
     256         * 何も行わないViewScopeです. 
     257         * 
     258         */ 
     259        private static class NullViewScope extends ViewScope { 
     260 
     261                /** 
     262                 * コンストラクタ. 
     263                 */ 
     264                private NullViewScope() { 
     265                        super(null); 
     266                } 
     267 
     268                /** 
     269                 * このメソッドは何も行いません. 
     270                 * 
     271                 * @param in ソース 
     272                 * @see org.intra_mart.jssp.view.ViewScope#analyze(java.io.Reader) 
     273                 */ 
     274                @Override 
     275                protected void analyze(final Reader in) { 
     276                        // do not nothing. 
     277                } 
     278 
     279                /** 
     280                 * このメソッドは必ず空文字を返却します. 
     281                 * 
     282                 * @param cx Context. 
     283                 * @param scope Scope. 
     284                 * @see org.intra_mart.jssp.view.ViewScope#execute(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable) 
     285                 */ 
     286                @Override 
     287                public String execute(final Context cx, final Scriptable scope) throws JavaScriptException, IOException { 
     288                        return ""; 
     289                } 
     290 
     291                /* 
     292                 * @see org.intra_mart.jssp.view.ViewScope#print() 
     293                 */ 
     294                @Override 
     295                public void print() { 
     296                        System.out.println("-- NullViewScope --"); 
     297                } 
     298        } 
    225299} 
  • trunk/im-jssp/src/main/java/org/intra_mart/jssp/view/tag/ImartTagAnalyzer.java

    r4 r399  
    55import java.io.Serializable; 
    66import java.io.StringReader; 
    7 import java.util.Enumeration
     7import java.util.ArrayList
    88import java.util.HashMap; 
    99import java.util.Iterator; 
     10import java.util.List; 
    1011import java.util.Map; 
    1112import java.util.NoSuchElementException; 
    12 import java.util.Vector; 
    1313 
    1414import org.intra_mart.jssp.util.ValueObject; 
     
    2626public class ImartTagAnalyzer implements Serializable { 
    2727 
    28         public static final Integer DYNAMIC_VALUE = new Integer(0);     // 動的接続変数 
    29         public static final Integer STATIC_VALUE = new Integer(1);      // 静的接続変数 
    30         public static final Integer SINGLE_VALUE = new Integer(2);      // 単一属性 
    31 //      public static final Boolean BOOL_TRUE = new Boolean(true);      // 真値 
    32         public static final Object[] FUNC_ARGS = new Object[0];         // 関数引数 
    33  
    34         private Map value = new HashMap();                              // タグ属性 
    35         private Map attribute = new HashMap();                  // 属性の種別 
    36         private ViewScope inner;                                                // タグに挟まれた部分 
    37  
    38         /** 
    39          * コンストラクタ 
    40          * @param in ソース 
    41          */ 
    42         public ImartTagAnalyzer(Reader in){ 
     28        /** 属性値種別 */ 
     29        private static enum TYPE { 
     30                /** 動的接続変数 */ 
     31                DYNAMIC, 
     32                /** 静的接続変数 */ 
     33                STATIC, 
     34                /** 単一属性 */ 
     35                SINGLE 
     36        } 
     37 
     38        /** 関数引数 */ 
     39        public static final Object[] FUNC_ARGS = new Object[0]; 
     40 
     41        /** タグ属性 */ 
     42        private final Map<String, Object> value = new HashMap<String, Object>(); 
     43        /** 属性の種別 */ 
     44        private final Map<String, TYPE> attribute = new HashMap<String, TYPE>(); 
     45 
     46        /** タグに挟まれた部分 */ 
     47        private ViewScope inner; 
     48 
     49        /** Empty Tag判定 */ 
     50        private boolean isEmptyTag = false; 
     51 
     52        /** 
     53         * コンストラクタ.<br /> IMARTタグの解析を行います.<br /> 
     54         * 引数inで指定するソースはViewScope#TAG_NAMEで始まっている必要があります. 
     55         *  
     56         * @param in 
     57         *            ソース 
     58         */ 
     59        public ImartTagAnalyzer(final Reader in) { 
    4360                super(); 
    44                  
     61 
    4562                // 解析 
    46                 analyze(in);     
    47                  
    48                 inner = new ViewScope(in); 
     63                analyze(in); 
     64 
     65                if (isEmptyTag) { 
     66                        // <IMART... />の為、空のinnerを登録 
     67                        // singletonな空のViewScopeを利用 
     68                        inner = ViewScope.EMPTY; 
     69                } else { 
     70                        inner = new ViewScope(in); 
     71                } 
    4972        } 
    5073 
    5174        /** 
    5275         * &lt;IMART&gt; タグの解析を開始する 
    53          * @param in ソース 
    54          */ 
    55         private void analyze(Reader in){ 
    56                 try{ 
    57                         // IMART のスキップ 
    58                         in.read();      // I 
    59                         in.read();      // M 
    60                         in.read();      // A 
    61                         in.read();      // R 
    62                         in.read();      // T 
     76         *  
     77         * @param in 
     78         *            ソース 
     79         */ 
     80        private void analyze(final Reader in) { 
     81                try { 
     82                        // タグ名のスキップ 
     83                        for (int i = 0; i < ViewScope.TAG_NAME.length(); i++) { 
     84                                // I M A R T 
     85                                in.read(); 
     86                        } 
    6387 
    6488                        // 属性値解析 
    6589                        analyzeAttribute(in); 
     90                } catch (final IOException ioe) { 
     91                } catch (final NullPointerException npe) { 
    6692                } 
    67                 catch(IOException ioe){ 
    68                 } 
    69                 catch(NullPointerException npe){ 
    70                 } 
    71         } 
    72  
     93        } 
    7394 
    7495        /** 
    7596         * &lt;IMART&gt; タグの属性の解析をする 
    7697         *  
    77          * @param in ソース 
     98         * @param in 
     99         *            ソース 
    78100         * @throws NullPointerException 
    79          * @throws IOException ストリームの読込エラー時 
    80          */ 
    81         private void analyzeAttribute(Reader in) throws NullPointerException, IOException{ 
    82                 StringBuffer buf = new StringBuffer(); 
     101         * @throws IOException 
     102         *             ストリームの読込エラー時 
     103         */ 
     104        private void analyzeAttribute(final Reader in) throws NullPointerException, IOException{ 
     105                final StringBuilder buf = new StringBuilder(); 
    83106                int chr; 
    84107                String sName = null; 
     
    93116                        // トークンの抽出 
    94117                        if(chr == (int)'\"'){ 
     118                                // 属性値の場合: 終端"までのトークンを抽出 
    95119                                buf.setLength(0); 
    96120                                while(true){ 
     
    99123                                                buf.append((char) chr); 
    100124                                                chr = in.read(); 
    101                                                 // エスケープシーケンスの変換 
    102 //                                              if(chr == (int)'\"'){ chr = (int)'\"'; } 
    103 //                                              else if(chr == (int)'\''){ chr = (int)'\''; } 
    104 //                                              else if(chr == (int)'\\'){ chr = (int)'\\'; } 
    105 //                                              else if(chr == (int)'t'){ chr = (int)'\t'; } 
    106 //                                              else if(chr == (int)'n'){ chr = (int)'\n'; } 
    107 //                                              else if(chr == (int)'r'){ chr = (int)'\r'; } 
    108 //                                              else{ chr = in.read(); } 
    109125                                        } 
    110126                                        else if(chr == (int)'\"'){ break; }     // 文字列定数終端 
     
    118134                                        if(bEqual){ 
    119135                                                value.put(sName, buf.toString()); 
    120                                                 attribute.put(sName, STATIC_VALUE); 
     136                                                attribute.put(sName, TYPE.STATIC); 
    121137                                                sName = null; 
    122138                                        } 
     
    125141                        } 
    126142                        else{ 
     143                                // 属性名/動的接続変数の抽出 
    127144                                buf.setLength(0); 
     145                                 
    128146                                // トークン抽出 
    129147                                while(!Character.isWhitespace((char)chr) && chr != -1 && chr != (int)'=' && chr != (int)'>'){ 
     148                                        // 閉じタグ判定 <IMART ... /> 
     149                                        if(chr == (int)'/') { 
     150                                                in.mark(1); 
     151                                                if(in.read() == (int)'>') { 
     152                                                        // '/>' 
     153                                                        isEmptyTag = true; 
     154                                                        break; 
     155                                                }else { 
     156                                                        in.reset(); 
     157                                                } 
     158                                        } 
     159 
    130160                                        buf.append((char) chr); 
    131161                                        chr = in.read(); 
     
    134164                                // 名前チェック 
    135165                                if(sName != null && bEqual){ 
     166                                        // 動的接続変数の場合 
    136167                                        // 変数名の解析("." で分割) 
    137                                         Vector variable = new Vector(); 
    138                                         Reader input = new StringReader(buf.toString()); 
     168                                        final List<String> variable = new ArrayList<String>(); 
     169                                        final Reader input = new StringReader(buf.toString()); 
    139170                                        int code; 
    140171                                        buf.setLength(0); 
     
    149180                                        } 
    150181                                        variable.add(buf.toString()); 
    151 //                                      value.put(sName, buf.toString()); 
    152182                                        value.put(sName, variable); 
    153                                         attribute.put(sName, DYNAMIC_VALUE); 
     183                                        attribute.put(sName, TYPE.DYNAMIC); 
    154184                                        sName = null; 
    155185                                } 
    156186                                else{ 
     187                                        // 単独属性の場合 (例: <IMART type="text" readonly></IMART> 
    157188                                        if(buf.length() != 0){ 
    158189                                                sName = buf.toString(); 
    159190                                                value.put(sName, sName);                                // 名前登録 
    160                                                 attribute.put(sName, SINGLE_VALUE);           // 単独属性判定 
     191                                                attribute.put(sName, TYPE.SINGLE);    // 単独属性判定 
    161192                                                bEqual = false; 
    162193                                        } 
     
    169200                        } 
    170201                        else if(chr == (int)'>'){ break; }      // タグ終了位置 
    171                 }       // End of While 
    172         } 
    173  
     202                         
     203                        if(isEmptyTag) { break; } // EmptyTagと認識された場合 
     204                } // End of While 
     205        } 
    174206 
    175207        /** 
    176208         * &lt;IMART&gt; タグの実行をする 
    177          * @param cx 現在の実行環境コンテキスト 
    178          * @param scope 現在の実行環境の変数スコープデータ 
     209         *  
     210         * @param cx 
     211         *            現在の実行環境コンテキスト 
     212         * @param scope 
     213         *            現在の実行環境の変数スコープデータ 
    179214         * @return HTMLソース(文字列) 
    180215         * @throws JavaScriptException 
    181216         */ 
    182         public String execute(Context cx, Scriptable scope) throws JavaScriptException{ 
     217        @SuppressWarnings("unchecked") 
     218        public String execute(final Context cx, final Scriptable scope) throws JavaScriptException { 
    183219                // 属性値オブジェクト(oAttr)の作成 
    184                 ScriptableObject attr = new ValueObject(); 
     220                final ScriptableObject attr = new ValueObject(); 
    185221 
    186222                // 値の抽出 
    187                 Iterator view = attribute.entrySet().iterator(); 
    188                 while(view.hasNext()){ 
    189                         try{ 
    190                                 Map.Entry item = (Map.Entry) view.next(); 
    191                                 String key = (String) item.getKey(); 
     223                for (final Map.Entry<String, TYPE> item : attribute.entrySet()) { 
     224                        try { 
     225                                final String key = (String) item.getKey(); 
    192226 
    193227                                // 値と属性の取得 
    194228                                Object data = value.get(key); 
    195                                 Object type = item.getValue(); 
    196  
    197                                 // 値の設定 
    198                                 if(type.equals(STATIC_VALUE)){ 
     229 
     230                                switch (item.getValue()) { 
     231                                case STATIC: 
    199232                                        // 静的データ 
    200233                                        attr.defineProperty(key, ImartObject.getConstant(cx, scope, data, data), ScriptableObject.EMPTY); 
    201                                 } 
    202                                 else if(type.equals(SINGLE_VALUE)){ 
     234                                       break; 
     235                                case SINGLE: 
    203236                                        // 単一属性 
    204237                                        attr.defineProperty(key, Boolean.TRUE, ScriptableObject.EMPTY); 
    205 //                                      attr.defineProperty(key, BOOL_TRUE, ScriptableObject.EMPTY); 
    206                                 } 
    207                                 else{ 
     238                                        break; 
     239                                case DYNAMIC: 
    208240                                        // 動的データ 
    209                                         Enumeration words = ((Vector) data).elements(); 
     241                                        final Iterator<String> words = ((List<String>) data).iterator(); 
    210242                                        data = scope; 
    211                                         while(words.hasMoreElements()){ 
    212                                                 data = ((ScriptableObject) data).get((String) words.nextElement(), null); 
    213                                                 if(! (data instanceof ScriptableObject)){ break; } 
    214                                         } 
    215                                         if(words.hasMoreElements() || (data == scope) || (data == ScriptableObject.NOT_FOUND)){ 
     243                                        while (words.hasNext()) { 
     244                                                data = ((ScriptableObject) data).get(words.next(), null); 
     245                                                if (!(data instanceof ScriptableObject)) { 
     246                                                        break; 
     247                                                } 
     248                                        } 
     249                                        if (words.hasNext() || (data == scope) || (data == ScriptableObject.NOT_FOUND)) { 
    216250                                                data = Undefined.instance; 
    217251                                        } 
    218 //                                      data = scope.get((String) data, null); 
    219                                         if(data instanceof Function){ 
     252                                        if (data instanceof Function) { 
    220253                                                attr.defineProperty(key, ((Function) data).call(cx, scope, null, FUNC_ARGS), ScriptableObject.EMPTY); 
    221                                         } 
    222                                         else{ 
     254                                        } else { 
    223255                                                attr.defineProperty(key, data, ScriptableObject.EMPTY); 
    224256                                        } 
    225                                 } 
    226                        
    227                         catch(NoSuchElementException nsee)
     257                                       break; 
     258                               
     259                        } catch (final NoSuchElementException nsee)
    228260                                // 属性値取得エラー 
    229                         } 
    230                         catch(JavaScriptException jse){ 
     261                        } catch (final JavaScriptException jse) { 
    231262                                // バインド関数実行時エラー 
    232263                        } 
     
    241272         * タグの解析結果を標準出力に表示するデータの確認用メソッド 
    242273         */ 
    243         public void print()
    244                 java.lang.System.out.println(value.toString()); 
    245                 java.lang.System.out.println(attribute.toString()); 
    246                 java.lang.System.out.println("[" + inner.hashCode() + "]-------------------------------------------------"); 
     274        public void print()
     275                System.out.println(value.toString()); 
     276                System.out.println(attribute.toString()); 
     277                System.out.println("[" + inner.hashCode() + "]-------------------------------------------------"); 
    247278                inner.print(); 
    248279        } 
    249  
    250280} 
    251281