Revision 47669 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.gml/src/main/java/org/gvsig/fmap/dal/store/gml/virtualrows/XMLFileAsList.java
XMLFileAsList.java | ||
---|---|---|
16 | 16 |
import java.nio.charset.StandardCharsets; |
17 | 17 |
import java.util.AbstractList; |
18 | 18 |
import java.util.ArrayList; |
19 |
import java.util.Arrays; |
|
19 | 20 |
import java.util.HashMap; |
20 | 21 |
import java.util.List; |
21 | 22 |
import java.util.Map; |
... | ... | |
43 | 44 |
import org.gvsig.tools.task.SimpleTaskStatus; |
44 | 45 |
import org.gvsig.tools.task.UserCancelTaskException; |
45 | 46 |
import org.gvsig.tools.util.GetItemWithSize64; |
47 |
import org.slf4j.Logger; |
|
48 |
import org.slf4j.LoggerFactory; |
|
46 | 49 |
import org.xml.sax.Attributes; |
47 | 50 |
import org.xml.sax.InputSource; |
48 | 51 |
import org.xml.sax.Locator; |
... | ... | |
58 | 61 |
extends AbstractList<List<String>> |
59 | 62 |
implements Closeable, GetItemWithSize64<List<String>> { |
60 | 63 |
|
64 |
private static final Logger LOGGER = LoggerFactory.getLogger(XMLFileAsList.class); |
|
65 |
|
|
61 | 66 |
public static final int COMBINE_NONE = 0; |
62 | 67 |
public static final int COMBINE_FIRST_NOT_NULL = 1; |
63 | 68 |
|
... | ... | |
132 | 137 |
localName = removeNamespace(qName); |
133 | 138 |
path.add(localName); |
134 | 139 |
String path_s = StringUtils.join(path, "/"); |
140 |
// System.out.println("start path_s "+path_s); |
|
135 | 141 |
if (StringUtils.equalsIgnoreCase(path_s, recordPath)) { |
136 | 142 |
return; |
137 | 143 |
} |
... | ... | |
165 | 171 |
localName = removeNamespace(qName); |
166 | 172 |
String path_s = StringUtils.join(path, "/"); |
167 | 173 |
|
174 |
// System.out.println("end path_s "+path_s); |
|
168 | 175 |
for (String fieldPath : fieldPaths) { |
169 | 176 |
if (StringUtils.equalsIgnoreCase(path_s, fieldPath)) { |
170 | 177 |
record.put(fieldPath, this.value.toString()); |
... | ... | |
211 | 218 |
if (handler == null) { |
212 | 219 |
return null; |
213 | 220 |
} |
221 |
|
|
214 | 222 |
try { |
215 | 223 |
Geometry geom = null; |
216 | 224 |
if(CollectionUtils.isNotEmpty(this.geomPaths)) { |
217 | 225 |
for (int i = 0; i < this.geomPaths.size(); i++) { |
218 |
long geomPosition = record.getLong(IDXFIELD_BEGINGEOMPOS+i*6); |
|
219 |
long endGeomPosition = record.getLong(IDXFIELD_ENDGEOMPOS+i*6); |
|
220 |
if(geomPosition == 0 || endGeomPosition == 0){ |
|
221 |
if(this.combineMode != COMBINE_FIRST_NOT_NULL){ |
|
222 |
handler.values.add(null); |
|
226 |
Reader limitedReader = null; |
|
227 |
BufferedReader breader = null; |
|
228 |
|
|
229 |
try { |
|
230 |
geom = null; |
|
231 |
long geomPosition = record.getLong(IDXFIELD_BEGINGEOMPOS+i*6); |
|
232 |
long endGeomPosition = record.getLong(IDXFIELD_ENDGEOMPOS+i*6); |
|
233 |
if(geomPosition == 0 || endGeomPosition == 0){ |
|
234 |
if(this.combineMode != COMBINE_FIRST_NOT_NULL){ |
|
235 |
handler.values.add(null); |
|
236 |
} |
|
237 |
continue; |
|
223 | 238 |
} |
224 |
continue; |
|
225 |
} |
|
226 |
this.reader.seek(geomPosition); |
|
227 |
if(position == 0){ |
|
228 |
char[] cbuff = new char[(int)(endGeomPosition-geomPosition)]; |
|
229 |
this.reader.read(cbuff); |
|
230 |
// System.out.println("["+new String(cbuff)+"]"); |
|
231 | 239 |
this.reader.seek(geomPosition); |
240 |
if(position == 0){ |
|
241 |
char[] cbuff = new char[(int)(endGeomPosition-geomPosition)]; |
|
242 |
this.reader.read(cbuff); |
|
243 |
// System.out.println("["+new String(cbuff)+"]"); |
|
244 |
this.reader.seek(geomPosition); |
|
245 |
} |
|
246 |
limitedReader = new LimitedReader(reader, (int)(endGeomPosition-geomPosition)); |
|
247 |
// TODO: calcular el buffersize como el min(8k,endGeomPosition-geomPosition+1) |
|
248 |
int bufferSize = 1024*8; |
|
249 |
breader = new BufferedReader(limitedReader, bufferSize); |
|
250 |
geom = GeometryLocator.getGeometryManager().createFrom(breader, null); |
|
251 |
} catch (Throwable t) { |
|
252 |
//Do nothing |
|
253 |
LOGGER.debug("Can't load geometry", t); |
|
232 | 254 |
} |
233 |
Reader limitedReader = new LimitedReader(reader, (int)(endGeomPosition-geomPosition)); |
|
234 |
// TODO: calcular el buffersize como el min(8k,endGeomPosition-geomPosition+1) |
|
235 |
int bufferSize = 1024*8; |
|
236 |
BufferedReader breader = new BufferedReader(limitedReader, bufferSize); |
|
237 |
geom = GeometryLocator.getGeometryManager().createFrom(breader, null); |
|
238 | 255 |
if(this.combineMode == COMBINE_FIRST_NOT_NULL){ |
239 | 256 |
if(geom != null){ |
240 | 257 |
handler.values.add(geom.convertToHexWKB()); |
241 | 258 |
break; |
242 | 259 |
} |
243 | 260 |
} else { |
244 |
handler.values.add(geom.convertToHexWKB()); |
|
261 |
handler.values.add(geom==null?null:geom.convertToHexWKB());
|
|
245 | 262 |
} |
246 | 263 |
} |
247 | 264 |
if(this.combineMode == COMBINE_FIRST_NOT_NULL && geom == null){ |
... | ... | |
454 | 471 |
positionCalculator.next(r.getInt(IDXFIELD_BEGINLINE), r.getInt(IDXFIELD_BEGINCOLUMN)); |
455 | 472 |
r.setLong(IDXFIELD_BEGINRECORDPOS, positionCalculator.getColumnPosition()); |
456 | 473 |
// System.out.println("RPOS : " + r.getLong(IDXFIELD_BEGINRECORDPOS)); |
474 |
//Todo esto es porque los campos de geometrias pueden tener distinta ordenacion en cada uno de los registros del XML |
|
457 | 475 |
if(CollectionUtils.isNotEmpty(geomPaths)) { |
458 |
for (int i = 0; i < geomPaths.size(); i++) { |
|
476 |
class Element implements Comparable<Element> { |
|
477 |
|
|
478 |
final int index; |
|
479 |
final long beginGeomLine; |
|
480 |
final long endGeomLine; |
|
481 |
final long beginGeomColumn; |
|
482 |
final long endGeomColumn; |
|
483 |
long beginGeomPos; |
|
484 |
long endGeomPos; |
|
485 |
|
|
486 |
Element(int index, long beginGeomLine, long endGeomLine, long beginGeomColumn, long endGeomColumn){ |
|
487 |
this.index = index; |
|
488 |
this.beginGeomLine = beginGeomLine; |
|
489 |
this.endGeomLine = endGeomLine; |
|
490 |
this.beginGeomColumn = beginGeomColumn; |
|
491 |
this.endGeomColumn = endGeomColumn; |
|
492 |
} |
|
493 |
|
|
494 |
@Override |
|
495 |
public int compareTo(Element o) { |
|
496 |
return Long.compare(beginGeomLine, o.beginGeomLine); |
|
497 |
} |
|
498 |
|
|
499 |
} |
|
500 |
Element[] elements = new Element[geomPaths.size()]; |
|
501 |
for (int i = 0; i < elements.length; i++) { |
|
459 | 502 |
long beginGeomLine = r.getInt(IDXFIELD_BEGINGEOMLINE + i * 6); |
460 | 503 |
long endGeomLine = r.getInt(IDXFIELD_ENDGEOMLINE + i * 6); |
461 |
if (beginGeomLine == 0 || endGeomLine == 0) { |
|
504 |
elements[i] = new Element( |
|
505 |
i, |
|
506 |
beginGeomLine, |
|
507 |
endGeomLine, |
|
508 |
r.getInt(IDXFIELD_BEGINGEOMCOLUMN + i * 6), |
|
509 |
r.getInt(IDXFIELD_ENDGEOMCOLUMN + i * 6) |
|
510 |
); |
|
511 |
} |
|
512 |
|
|
513 |
Arrays.sort(elements); |
|
514 |
for (int i = 0; i < elements.length; i++) { |
|
515 |
Element e = elements[i]; |
|
516 |
if (e.beginGeomLine == 0 || e.endGeomLine == 0) { |
|
462 | 517 |
continue; |
463 | 518 |
} |
464 |
positionCalculator.next(beginGeomLine, r.getInt(IDXFIELD_BEGINGEOMCOLUMN + i * 6)); |
|
465 |
r.setLong(IDXFIELD_BEGINGEOMPOS + i * 6, positionCalculator.getColumnPosition()); |
|
466 |
positionCalculator.next(endGeomLine, r.getInt(IDXFIELD_ENDGEOMCOLUMN + i * 6)); |
|
467 |
r.setLong(IDXFIELD_ENDGEOMPOS + i * 6, positionCalculator.getColumnPosition()); |
|
468 |
// System.out.println("GPOS" + i + " : " + r.getLong(IDXFIELD_BEGINGEOMPOS + i * 6) + " " + r.getLong(IDXFIELD_ENDGEOMPOS + i * 6)); |
|
519 |
positionCalculator.next(e.beginGeomLine, e.beginGeomColumn); |
|
520 |
e.beginGeomPos = positionCalculator.getColumnPosition(); |
|
521 |
positionCalculator.next(e.endGeomLine, e.endGeomColumn); |
|
522 |
e.endGeomPos = positionCalculator.getColumnPosition(); |
|
469 | 523 |
} |
524 |
|
|
525 |
for (int i = 0; i < elements.length; i++) { |
|
526 |
Element e = elements[i]; |
|
527 |
r.setLong(IDXFIELD_BEGINGEOMPOS + e.index * 6, e.beginGeomPos); |
|
528 |
r.setLong(IDXFIELD_ENDGEOMPOS + e.index * 6, e.endGeomPos); |
|
529 |
} |
|
530 |
|
|
531 |
// for (int i = 0; i < geomPaths.size(); i++) { |
|
532 |
// long beginGeomLine = r.getInt(IDXFIELD_BEGINGEOMLINE + i * 6); |
|
533 |
// long endGeomLine = r.getInt(IDXFIELD_ENDGEOMLINE + i * 6); |
|
534 |
// if (beginGeomLine == 0 || endGeomLine == 0) { |
|
535 |
// continue; |
|
536 |
// } |
|
537 |
// positionCalculator.next(beginGeomLine, r.getInt(IDXFIELD_BEGINGEOMCOLUMN + i * 6)); |
|
538 |
// r.setLong(IDXFIELD_BEGINGEOMPOS + i * 6, positionCalculator.getColumnPosition()); |
|
539 |
// positionCalculator.next(endGeomLine, r.getInt(IDXFIELD_ENDGEOMCOLUMN + i * 6)); |
|
540 |
// r.setLong(IDXFIELD_ENDGEOMPOS + i * 6, positionCalculator.getColumnPosition()); |
|
541 |
//// System.out.println("GPOS" + i + " : " + r.getLong(IDXFIELD_BEGINGEOMPOS + i * 6) + " " + r.getLong(IDXFIELD_ENDGEOMPOS + i * 6)); |
|
542 |
// } |
|
470 | 543 |
} |
471 | 544 |
theIndex.set(j, r); |
472 | 545 |
if (status != null) { |
Also available in: Unified diff