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 java.util.Map;
019    
020    /**
021     * JSP/XMLファイルを読み取って、構築されるæœ?¸Š位ã? OGDocument オブジェクãƒ?を定義しますã?
022     *
023     * JspSaxParser での read/write で構築される トップレベルの OGNode になりますã?
024     *
025     * @og.rev 5.1.8.0 (2010/07/01) 新規作æ?
026     *
027     * @version  5.0
028     * @author   Kazuhiko Hasegawa
029     * @since    JDK6.0,
030     */
031    public class OGDocument extends OGNode {
032            private Map<String,OGElement> idMap = null;               // 5.1.9.0 (2010/08/01)
033            private String file   = null;
034            private String encode = "UTF-8";                                // 基本çš?�«は、XML は、UTF-8 で扱ã�??が良ã�??
035            private String nameSpace = null;                                // 5.2.1.0 (2010/10/01) トップエレメントã?名前空間ã?キャãƒ?‚·ュ
036    
037            /**
038             * ãƒ?ƒ•ォルトコンストラクター
039             *
040             * NodeType ã‚?Document に設定し、デフォルトã? OGNode を構築しますã?
041             *
042             */
043            public OGDocument() {
044                    super();
045                    setNodeType( OGNodeType.Document );
046            }
047    
048            /**
049             * æœ?¸Š位ã? エレメントを返しますã?
050             *
051             * ノã?ドが、まã�?™»録されてã�?�ªã�??またã?、エレメントノードでなã�??合ã?、null が返されますã?
052             *
053             * @return      æœ?¸Š位ã?エレメンãƒ?
054             */
055            public OGElement getTopElement() {
056                    if( nodeSize() > 0 ) {
057                            OGNode node = getNode( 0 );
058                            if( node.getNodeType() == OGNodeType.Element ) {
059                                    return (OGElement)node;
060                            }
061                    }
062                    return null ;
063            }
064    
065            /**
066             * こã?ドキュメントã?読み込みå…??ファイル名をセãƒ?ƒˆしますã?
067             *
068             * ドキュメントã?処ç�??可否を判断したりã?ãƒ?ƒ�ãƒ?‚°時に使用しますã?
069             *
070             * @param       name    読み込んだファイルå�?
071             */
072            public void setFilename( final String name ) {
073                    file = name;
074            }
075    
076            /**
077             * こã?ドキュメントã?読み込みå…??ファイル名を取得しますã?
078             *
079             * ドキュメントã?処ç�??可否を判断したりã?ãƒ?ƒ�ãƒ?‚°時に使用しますã?
080             *
081             * @return      読み込んだファイルå�?
082             */
083            public String getFilename() {
084                    return file;
085            }
086    
087            /**
088             * こã?ドキュメントã?XML宣è¨??エンコード属æ?をセãƒ?ƒˆしまã�?初期値:UTF-8)ã€?
089             *
090             * ドキュメントã?出力時の XML 宣è¨?�«付与しますã?
091             * null の設定が可能ですã? null をセãƒ?ƒˆすると、XML宣è¨??力時にã€?
092             * encode 属æ?になにもセãƒ?ƒˆしませんã€?
093             *
094             * @param       encode  XML宣è¨??エンコード属æ?
095             */
096            public void setEncode( final String encode ) {
097                    this.encode = encode;
098            }
099    
100            /**
101             * こã?ドキュメントã?XML宣è¨??エンコード属æ?を取得しまã�?初期値:UTF-8)ã€?
102             *
103             * ドキュメントã?出力時の XML 宣è¨?�«付与しますã?
104             * encode 属æ?になにもセãƒ?ƒˆされてã�?�ªã�??合ã?、null が返されますã?
105             *
106             * @return      XML宣è¨??エンコード属æ?
107             */
108            public String getEncode() {
109                    return encode;
110            }
111    
112            /**
113             * こã?ドキュメントã? "hybs-taglib.tld" の nameSpace(名前空é–?を返しますã?
114             *
115             * 通常は、標準エンジンの場合ã? "og" になりますã?
116             * 社å†?‚·スãƒ?ƒ の場合ã?、互換性の関係からã?"mis" になってã�?�¾すã?
117             * Ver3 の時代はã€?mis-taglib.tld" ã�?�£たã?で、この処ç�??できませんã€?
118             *
119             * @og.rev 5.2.1.0 (2010/10/01) 新規作æ?
120             *
121             * @return      名前空é–?存在しなã�?�¨きã?、ゼロæ–?­—å?)
122             */
123            public String getNameSpace() {
124                    if( nameSpace != null ) { return nameSpace; }
125    
126                    nameSpace = "" ;                // 存在しなã�?�¨きã?、ゼロæ–?­—å?になるã?
127                    OGElement ele = getTopElement();
128                    if( ele != null ) {
129                            OGAttributes attri = ele.getOGAttributes();
130                            for( int i=0; i<attri.size(); i++ ) {
131                                    if( "hybs-taglib.tld".equals( attri.getVal(i) ) ) {
132                                            String key = attri.getKey(i);                   // xmlns:og , xmlns:mis などのはã�?
133                                            int cm = key.indexOf( ':' );
134                                            nameSpace = key.substring( cm+1 );                      // : は削除してã�?‚‹ã€?og" など
135                                            break;
136                                    }
137                            }
138                    }
139                    return nameSpace;
140            }
141    
142            /**
143             * こã?ドキュメントに含まれる id に対する、エレメントã?マップをセãƒ?ƒˆしますã?
144             *
145             * id æŒ?®šされてã�?‚‹エレメントã?、特別にキャãƒ?‚·ュされますã?
146             * またã?ドキュメント中には、id は、ä¸?„�に設定されてã�?‚‹こととしますã?
147             * è¤?•°、おなã�?id が存在する場合ã?ã€?保障されませんã�?性質上ã?æœ?¾Œに登録されã�?
148             * エレメントが、設定されますã?
149             *
150             * @param       map     エレメントã?マッãƒ?
151             */
152            public void setIdMap( final Map<String,OGElement> map ) {
153                    idMap = map;
154            }
155    
156            /**
157             * æŒ?®šã? id に対するエレメントを返しますã?
158             *
159             * id に対するエレメントが存在しなã�??合ã?、null が返されますã?
160             *
161             * @param       id      æŒ?®šã?ID
162             *
163             * @return      OGエレメンãƒ?
164             */
165            public OGElement getElementById( final String id ) {
166                    OGElement ele = null;
167    
168                    if( idMap != null ) { ele = idMap.get( id ); }
169    
170                    return ele ;
171            }
172    
173            /**
174             * オブジェクトã?æ–?­—å?表現を返しますã?
175             *
176             * ここでは、ドキュメントにXML宣è¨?‚’つけた状態ã?æ–?­—å?を返しますã?
177             * 基本çš?�«は、ドキュメントには、ä¸?�¤ã�?�‘ エレメントを含ã‚?�“とになりますã?
178             * よって、XML宣è¨?‚’つけなã�?ж態で出力するå?合ã?ã€?getTopElement() で
179             * エレメントを取得して、それを、toString() してくださいã€?
180             *
181             * @og.rev 5.6.4.4 (2013/05/31) 改行3つを改行2つに置換しますã?
182             *
183             * @return      こã?オブジェクトã?æ–?­—å?表現
184             * @see OGNode#toString()
185             * @see #getTopElement()
186             */
187            @Override
188            public String toString() {
189                    StringBuilder buf = new StringBuilder();
190    
191                    buf.append( "<?xml version=\"1.0\"" );
192                    if( encode != null ) {
193                            buf.append( " encoding=\"" ).append( encode ).append( "\"" );
194                    }
195                    buf.append( "?>" ).append( CR ).append( super.toString() );
196    
197    //              return buf.toString() ;
198                    String rtn = buf.toString() ;
199                    return rtn.replaceAll( CR+CR+CR , CR+CR ) ;                     // 改行3つを改行2つに置換しますã?
200            }
201    }