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

View differences:

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