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 }