Revision 53 branches/v1_9_0/libGPE-GML/src/org/gvsig/gpe/gml/parser/v2/features/ElementTypeBinding.java

View differences:

ElementTypeBinding.java
5 5
import javax.xml.namespace.QName;
6 6

  
7 7
import org.gvsig.gpe.gml.parser.GPEDefaultGmlParser;
8
import org.gvsig.gpe.gml.parser.profiles.IBindingProfile;
8 9
import org.gvsig.gpe.gml.utils.GMLGeometries;
10
import org.gvsig.gpe.gml.utils.GMLTags;
9 11
import org.gvsig.gpe.gml.utils.GMLUtilsParser;
12
import org.gvsig.gpe.parser.IGPEContentHandler;
13
import org.gvsig.gpe.xml.stream.EventType;
10 14
import org.gvsig.gpe.xml.stream.IXmlStreamReader;
11 15
import org.gvsig.gpe.xml.stream.XmlStreamException;
12 16
import org.gvsig.gpe.xml.utils.CompareUtils;
......
109 113
	 * @throws IOException
110 114
	 */
111 115
	public Object parse(IXmlStreamReader parser,GPEDefaultGmlParser handler, Object feature, Object parentElement, IXSElementDeclaration parentType) throws XmlStreamException, IOException {
116

  
117
        parser.require(EventType.START_ELEMENT, null, null);
118
        
112 119
		boolean endFeature = false;
113 120
		boolean isGeometryTag = false;
114
		int currentTag;		
121
		EventType currentEvent;		
115 122
		Object element = null;	
116 123
		Object value = null;
117 124
		Object geometry = null;
118 125
		boolean isInitialized = false;
119 126
		//Used to finish to parse the current element
120
		QName elementRootType = parser.getName();
127
		final QName elementRootType = parser.getElementName();
121 128
		String type = null;	
122 129
		
123 130
		XMLAttributesIterator attributesIterator = new XMLAttributesIterator(parser);
......
135 142
			type = TypeUtils.getXSType(String.class);
136 143
		}
137 144
		
138
		QName tag = parser.getName();
139
		currentTag = parser.getEventType();
145
		QName tag = parser.getElementName();
146
		currentEvent = parser.getEventType();
140 147

  
148
        final IGPEContentHandler contentHandler = handler.getContentHandler();
149
        final IBindingProfile profile = handler.getProfile();
150
        final String namespaceURI = elementRootType.getNamespaceURI();
151
        final String localName = GMLUtilsParser.removeBlancSymbol(elementRootType.getLocalPart());
141 152
		while (!endFeature){
142
			switch(currentTag){
143
			case IXmlStreamReader.START_ELEMENT:
153
            switch(currentEvent.getCode()){
154
			case EventType.START_ELEMENT_CODE:
144 155
				if (!(CompareUtils.compareWithNamespace(tag,elementRootType))){
145 156
					//If is a geometry
146
					if (GMLGeometries.isGML(tag)){
147
						geometry = handler.getProfile().getGeometryBinding().
148
								parse(parser, handler);
149
						handler.getContentHandler().addGeometryToFeature(geometry, feature);
150
						if (geometry==null){
151
							System.out.println("\t\t\tGEOMETRIA VACIA");
152
							//Warning geometria vacia
153
						}
154
						isGeometryTag=true;
157
                    if (GMLGeometries.isGML(tag)){
158
                        geometry = profile.getGeometryBinding().parse(parser, handler);
159
                        contentHandler.addGeometryToFeature(geometry, feature);
160
                        if (geometry == null) {
161
                            System.out.println("\t\t\tGEOMETRIA VACIA");
162
                            // Warning geometria vacia
163
                        }
164
                        isGeometryTag = true;
155 165
					}else {
156 166
						//If is not a geometry could be a complex feature
157 167
						if (!isInitialized){
158
							element = handler.getContentHandler().startElement(elementRootType.getNamespaceURI(),
159
									GMLUtilsParser.removeBlancSymbol(elementRootType.getLocalPart()),
160
									null,
161
									attributesIterator,
162
									parentElement);
163
							isInitialized = true;
168
                            element = contentHandler.startElement(namespaceURI, localName, null,
169
                                    attributesIterator, parentElement);
170
                            isInitialized = true;
164 171
						}
165
						handler.getProfile().getElementTypeBinding().
166
							parse(parser, handler, feature, element, null);
172
                        final ElementTypeBinding elementTypeBinding = profile
173
                                .getElementTypeBinding();
174
                        elementTypeBinding.parse(parser, handler, feature, element, null);
167 175
					}				
168 176
				}
169 177
				break;
170
			case IXmlStreamReader.END_ELEMENT:
178
			case EventType.END_ELEMENT_CODE:
171 179
				if (CompareUtils.compareWithNamespace(tag,elementRootType)){						
172 180
					endFeature = true;
173 181
					//If not is complex the element has not been created yet
174 182
					if (!isInitialized){
175
						element = handler.getContentHandler().startElement(
176
								elementRootType.getNamespaceURI(),
177
								GMLUtilsParser.removeBlancSymbol(elementRootType.getLocalPart()), 
178
								value,	
179
								attributesIterator,
180
								parentElement);
183
                        element = contentHandler.startElement(namespaceURI, localName, value,
184
                                attributesIterator, parentElement);
181 185
						isInitialized = true;
182 186
					}
183
					handler.getContentHandler().endElement(element);
187
					contentHandler.endElement(element);
184 188
				}
185 189
				break;
186
			case IXmlStreamReader.CHARACTERS:					
187
				if (geometry == null){
188
					value = TypeUtils.getValue(elementType, parser.getText());
189
				}
190
			default:
191
                if (currentEvent.isValue()) {
192
                    if (geometry == null) {
193
                        switch (currentEvent.getCode()) {
194
                        case EventType.VALUE_BOOL_CODE:
195
                            value = Boolean.valueOf(parser.getBooleanValue());
196
                            break;
197
                        case EventType.VALUE_BYTE_CODE:
198
                            value = new Integer(parser.getByteValue());
199
                            break;
200
                        case EventType.VALUE_DOUBLE_CODE:
201
                            value = new Double(parser.getDoubleValue());
202
                            break;
203
                        case EventType.VALUE_FLOAT_CODE:
204
                            value = new Float(parser.getFloatValue());
205
                            break;
206
                        case EventType.VALUE_INT_CODE:
207
                            value = new Integer(parser.getIntValue());
208
                            break;
209
                        case EventType.VALUE_LONG_CODE:
210
                            value = new Long(parser.getLongValue());
211
                            break;
212
                        default:
213
                            value = TypeUtils.getValue(elementType, parser.getText());
214
                            break;
215
                        }
216
                    }
217
                }
190 218
				break;
191 219
			}
192 220
			if (!endFeature){					
193
				currentTag = parser.next();
194
				tag = parser.getName();
221
				currentEvent = parser.next();
222
				if(currentEvent.isTag()){
223
				    tag = parser.getElementName();
224
				}
195 225
			}
196
		}			
226
		}
227
		
228
		parser.require(EventType.END_ELEMENT, elementRootType);
197 229
		return element;		
198 230
	}
199 231
}

Also available in: Unified diff