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 }