Revision 53 branches/v1_9_0/libGPE-GML/src/org/gvsig/gpe/gml/parser/v2/features/FeatureTypeBinding.java
FeatureTypeBinding.java | ||
---|---|---|
1 | 1 |
package org.gvsig.gpe.gml.parser.v2.features; |
2 | 2 |
|
3 | 3 |
import java.io.IOException; |
4 |
import java.util.Iterator; |
|
4 | 5 |
import java.util.Map; |
5 | 6 |
|
6 | 7 |
import javax.xml.namespace.QName; |
7 | 8 |
|
8 | 9 |
import org.gvsig.gpe.gml.parser.GPEDefaultGmlParser; |
10 |
import org.gvsig.gpe.gml.parser.profiles.IBindingProfile; |
|
11 |
import org.gvsig.gpe.gml.parser.v2.geometries.GeometryBinding; |
|
9 | 12 |
import org.gvsig.gpe.gml.utils.GMLGeometries; |
10 | 13 |
import org.gvsig.gpe.gml.utils.GMLObject; |
11 | 14 |
import org.gvsig.gpe.gml.utils.GMLTags; |
12 | 15 |
import org.gvsig.gpe.gml.utils.GMLUtilsParser; |
16 |
import org.gvsig.gpe.parser.IGPEContentHandler; |
|
17 |
import org.gvsig.gpe.xml.stream.EventType; |
|
13 | 18 |
import org.gvsig.gpe.xml.stream.IXmlStreamReader; |
14 | 19 |
import org.gvsig.gpe.xml.stream.XmlStreamException; |
15 | 20 |
import org.gvsig.gpe.xml.utils.CompareUtils; |
... | ... | |
122 | 127 |
* @throws IOException |
123 | 128 |
*/ |
124 | 129 |
public Object parse(IXmlStreamReader parser,GPEDefaultGmlParser handler) throws XmlStreamException, IOException { |
130 |
|
|
131 |
parser.require(EventType.START_ELEMENT, null, null); |
|
132 |
|
|
125 | 133 |
boolean endFeature = false; |
126 |
int currentTag;
|
|
134 |
EventType currentTag;
|
|
127 | 135 |
Object feature = null; |
128 | 136 |
//Used to finish to parse the current feature member |
129 |
QName featureRootType = parser.getName(); |
|
137 |
QName featureRootType = parser.getElementName();
|
|
130 | 138 |
|
131 | 139 |
XMLAttributesIterator attributesIterator = new XMLAttributesIterator(parser); |
132 | 140 |
String fid = getID(attributesIterator.getAttributes()); |
... | ... | |
144 | 152 |
// } |
145 | 153 |
// elementName = featureElement.getTypeName(); |
146 | 154 |
// } |
147 |
feature = handler.getContentHandler().startFeature(fid,
|
|
148 |
featureRootType.getNamespaceURI(),
|
|
149 |
GMLUtilsParser.removeBlancSymbol(featureRootType.getLocalPart()),
|
|
150 |
attributesIterator,
|
|
151 |
null);
|
|
155 |
final IGPEContentHandler contentHandler = handler.getContentHandler();
|
|
156 |
String namespaceURI = featureRootType.getNamespaceURI();
|
|
157 |
String typeName = GMLUtilsParser.removeBlancSymbol(featureRootType.getLocalPart());
|
|
158 |
feature = contentHandler
|
|
159 |
.startFeature(fid, namespaceURI, typeName, attributesIterator, null);
|
|
152 | 160 |
|
153 |
QName tag = parser.getName(); |
|
161 |
QName tag = parser.getElementName();
|
|
154 | 162 |
currentTag = parser.getEventType(); |
155 | 163 |
|
156 | 164 |
while (!endFeature){ |
157 |
switch(currentTag){ |
|
158 |
case IXmlStreamReader.START_ELEMENT:
|
|
165 |
switch(currentTag.getCode()){
|
|
166 |
case EventType.START_ELEMENT_CODE:
|
|
159 | 167 |
if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_NAME)){ |
160 | 168 |
parser.next(); |
161 |
handler.getContentHandler().addNameToFeature(parser.getText(), feature);
|
|
169 |
contentHandler.addNameToFeature(parser.getText(), feature);
|
|
162 | 170 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_DESCRIPTION)){ |
163 | 171 |
parser.next(); |
164 | 172 |
String description = parser.getText(); |
165 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_BOUNDEDBY)){ |
|
166 |
Object bbox = handler.getProfile().getBoundedByTypeBinding().parse(parser, handler); |
|
167 |
handler.getContentHandler().addBboxToFeature(bbox, feature); |
|
168 |
}else{ |
|
169 |
//If is not a GML... |
|
170 |
if (!(CompareUtils.compareWithNamespace(featureRootType,tag))){ |
|
171 |
if (GMLGeometries.isGML(tag)){ |
|
172 |
Object geometry = handler.getProfile().getGeometryBinding().parse(parser, handler); |
|
173 |
handler.getContentHandler().addGeometryToFeature(geometry, feature); |
|
174 |
}else{ |
|
175 |
//Elements (elements or features) |
|
176 |
Object element = handler.getProfile().getElementTypeBinding().parse(parser, handler, feature, null, null); |
|
177 |
handler.getContentHandler().addElementToFeature(element, feature); |
|
178 |
} |
|
179 |
} |
|
180 |
} |
|
173 |
} else { |
|
174 |
final IBindingProfile profile = handler.getProfile(); |
|
175 |
if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_BOUNDEDBY)){ |
|
176 |
Object bbox = profile.getBoundedByTypeBinding().parse(parser, handler); |
|
177 |
contentHandler.addBboxToFeature(bbox, feature); |
|
178 |
}else{ |
|
179 |
//If is not a GML... |
|
180 |
if (!(CompareUtils.compareWithNamespace(featureRootType,tag))){ |
|
181 |
if (GMLGeometries.isGML(tag)){ |
|
182 |
GeometryBinding geometryBinding = profile.getGeometryBinding(); |
|
183 |
Object geometry = geometryBinding.parse(parser, handler); |
|
184 |
contentHandler.addGeometryToFeature(geometry, feature); |
|
185 |
}else{ |
|
186 |
//Elements (elements or features) |
|
187 |
ElementTypeBinding elementTypeBinding = profile.getElementTypeBinding(); |
|
188 |
Object element = elementTypeBinding.parse(parser, handler, feature, null, null); |
|
189 |
contentHandler.addElementToFeature(element, feature); |
|
190 |
} |
|
191 |
} |
|
192 |
} |
|
193 |
} |
|
181 | 194 |
break; |
182 |
case IXmlStreamReader.END_ELEMENT:
|
|
195 |
case EventType.END_ELEMENT_CODE:
|
|
183 | 196 |
if (CompareUtils.compareWithNamespace(featureRootType, tag)){ |
184 | 197 |
endFeature = true; |
185 |
handler.getContentHandler().endFeature(feature);
|
|
198 |
contentHandler.endFeature(feature);
|
|
186 | 199 |
} |
187 | 200 |
break; |
188 |
case IXmlStreamReader.CHARACTERS: |
|
189 |
|
|
190 |
break; |
|
191 | 201 |
} |
192 | 202 |
if (!endFeature){ |
193 |
currentTag = parser.next(); |
|
194 |
tag = parser.getName(); |
|
203 |
currentTag = parser.nextTag();
|
|
204 |
tag = parser.getElementName();
|
|
195 | 205 |
} |
196 | 206 |
} |
197 | 207 |
return new GMLObject(feature,GMLObject.FEATURE); |
... | ... | |
205 | 215 |
* The id |
206 | 216 |
*/ |
207 | 217 |
public String getID(Map hash){ |
208 |
if (hash.containsKey(GMLTags.GML_FID)){ |
|
209 |
return (String)hash.get(GMLTags.GML_FID); |
|
210 |
} |
|
211 |
String id = GMLTags.GML_NAMESPACE_PREFIX + ":" + GMLTags.GML_ID; |
|
212 |
if (hash.containsKey(id)){ |
|
213 |
return (String)hash.get(id); |
|
214 |
} |
|
215 |
return null; |
|
218 |
if (hash.size() == 0) { |
|
219 |
return null; |
|
220 |
} |
|
221 |
Map.Entry e; |
|
222 |
QName name; |
|
223 |
for (Iterator it = hash.entrySet().iterator(); it.hasNext();) { |
|
224 |
e = (Map.Entry) it.next(); |
|
225 |
name = (QName) e.getKey(); |
|
226 |
if (GMLTags.GML_FID.getLocalPart().equals(name.getLocalPart()) |
|
227 |
|| GMLTags.GML_ID.getLocalPart().equals(name.getLocalPart())) { |
|
228 |
return (String) e.getValue(); |
|
229 |
} |
|
230 |
} |
|
231 |
return null; |
|
216 | 232 |
} |
217 | 233 |
} |
Also available in: Unified diff