Revision 108

View differences:

org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/test/java/org/gvsig/fmap/dal/store/dgn/TestDGN.java
28 28
package org.gvsig.fmap.dal.store.dgn;
29 29

  
30 30
import java.io.File;
31
import java.net.URL;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataManager;
31 34

  
32 35
import org.gvsig.fmap.dal.DataStoreParameters;
33 36
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.BaseTestFeatureStore;
35 37
import org.gvsig.fmap.dal.feature.FeatureStore;
38
import org.gvsig.tools.junit.AbstractLibraryAutoInitTestCase;
36 39

  
37
public class TestDGN extends BaseTestFeatureStore {
40
import static junit.framework.Assert.assertNotNull;
38 41

  
39
	public static final File file_prueba = new File(TestDGN.class.getResource(
40
			"data/prueba.dgn").getFile());
41
	
42
public class TestDGN extends AbstractLibraryAutoInitTestCase {
43

  
44
	private File file_prueba = null;
45
        private DataManager dataManager = null;
46

  
47
        @Override
48
        protected void doSetUp() throws Exception {
49
            URL res = TestDGN.class.getResource("data/prueba.dgn");
50
            this.file_prueba = new File(res.getFile());
51
            this.dataManager = DALLocator.getDataManager();
52
        }
53

  
54
        
42 55
	/*
43 56
	 * (non-Javadoc)
44 57
	 *
......
48 61
	 */
49 62
	public DataStoreParameters getDefaultDataStoreParameters()
50 63
			throws DataException {
64
            
51 65
		DGNStoreParameters dgnParameters = null;
52 66

  
53 67
		dgnParameters = (DGNStoreParameters) dataManager
......
74 88

  
75 89

  
76 90
	public void testLegendAndLabeling() throws Exception {
77
		FeatureStore store = (FeatureStore) dataManager
78
				.createStore(getDefaultDataStoreParameters());
91
		FeatureStore store = (FeatureStore) dataManager.openStore(
92
                        DGNStoreProvider.NAME,
93
                        getDefaultDataStoreParameters()
94
                );
79 95

  
80 96
		assertNotNull(store.invokeDynMethod("getLegend", null));
81 97
		assertNotNull(store.invokeDynMethod("getLabeling", null));
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/resources/org/gvsig/fmap/dal/store/dgn/DGNParameters.xml
26 26
        <field name="sortByGeometryType" label="Sort by geometry type" type="Boolean" defaultValue="true" mandatory="false">
27 27
          <description>If checked sort the rows of table by the geometry type (none,suface,curve,point)</description>
28 28
        </field>
29
        <field name="ignoreZ" label="Ignore Z" type="Boolean" defaultValue="false" mandatory="false">
30
          <description>If checked and DGN has Z dimension, set all Zs to 0.</description>
29
        <field name="force2d" label="Force 2D" type="Boolean" defaultValue="false" mandatory="false">
30
          <description>If checked and DGN has Z dimension create all geometry in 2D and ignore the Zs.</description>
31 31
        </field>
32 32
        <field name="Reload" label="Reload" type="Boolean" defaultValue="false" mandatory="false">
33 33
          <description>Reload an already loaded DGN as a new layer</description>
......
50 50
        </field>
51 51

  
52 52
        <!-- Advanced -->
53
        <field name="ignoreZ" label="Ignore Z" type="Boolean" defaultValue="false" mandatory="false">
54
          <description>If checked and DGN has Z dimension, set all Zs to 0.</description>
55
        </field>
53 56
        <field name="useZAsElevation" label="Use Z as elevation" type="Boolean" defaultValue="false" mandatory="false" group="Advanced">
54 57
          <description>If set, use the Z value to fill the field elevation.</description>
55 58
        </field>
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/lib/DGNElemCore.java
19 19
 */
20 20
package org.gvsig.fmap.dal.store.dgn.lib;
21 21

  
22
import java.util.Formatter;
23

  
22 24
/**
23 25
 * Clase utilizada para guardar un elemento de tipo Base del cual extienden los
24 26
 * dem?s tipos.
......
136 138
        public int getSType() {
137 139
            return this.stype;
138 140
        }
141
        
142

  
143
        public byte[] getData() {
144
            return this.raw_data;
145
        }
146

  
147
        public String getDataAsHexadecimal() {
148
            if( this.raw_data == null ) {
149
                return null;
150
            }
151
            Formatter out = new Formatter();
152

  
153
            for (int i = 0; i < this.raw_data.length; i++) {
154
                int ch = this.raw_data[i] & 0xff;
155
                out.format("%02X", ch);
156
            }
157
            return out.toString();
158
        }
139 159
}
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/DGNStoreParameters.java
56 56
    public static final String FIELD_LINK_FILTER_DATA = "LinkFilterData";
57 57

  
58 58
    public static final String FIELD_GROUP_GEOMETRIES_OPERATION = "GroupGeometriesOperation";
59
    public static final String FIELD_FORZE2D = "force2D";
59 60
    
60 61
    
61 62
    private DelegatedDynObject parameters;
......
285 286
        }
286 287
        return x.booleanValue();
287 288
    }
289

  
290
    boolean force2D() {
291
        Boolean x = (Boolean) this.getDynValue(FIELD_FORZE2D);
292
        if (x == null) {
293
            return Boolean.FALSE;
294
        }
295
        return x.booleanValue();
296
    }
297

  
288 298
    public boolean sortByGeometryType() {
289 299
        Boolean x = (Boolean) this.getDynValue(FIELD_SORT_BY_GEOMETRY_TYPE);
290 300
        if (x == null) {
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/DGNStoreProvider.java
7 7
import java.io.FileWriter;
8 8
import java.io.IOException;
9 9
import java.util.ArrayList;
10
import java.util.Collections;
11
import java.util.Comparator;
10
import java.util.Date;
12 11
import java.util.HashMap;
13 12
import java.util.Iterator;
14 13
import java.util.List;
15 14
import java.util.Map;
16
import java.util.regex.Pattern;
17 15
import org.apache.commons.io.IOUtils;
18
import org.apache.commons.lang3.StringUtils;
19 16

  
20 17
import org.cresques.cts.IProjection;
21 18
import org.gvsig.fmap.dal.DALLocator;
......
59 56
import org.gvsig.fmap.geom.GeometryManager;
60 57
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
61 58
import org.gvsig.fmap.geom.Geometry.TYPES;
62
import org.gvsig.fmap.geom.aggregate.Aggregate;
63
import org.gvsig.fmap.geom.aggregate.MultiCurve;
64
import org.gvsig.fmap.geom.aggregate.MultiLine;
65
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
66
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
67 59
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
68 60
import org.gvsig.fmap.geom.exception.CreateGeometryException;
69
import org.gvsig.fmap.geom.primitive.Curve;
70 61
import org.gvsig.fmap.geom.primitive.Envelope;
71 62
import org.gvsig.fmap.geom.primitive.GeneralPathX;
72
import org.gvsig.fmap.geom.primitive.Line;
73 63
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
74 64
import org.gvsig.fmap.geom.primitive.Point;
75
import org.gvsig.fmap.geom.primitive.Polygon;
76
import org.gvsig.fmap.geom.primitive.Primitive;
77
import org.gvsig.fmap.geom.primitive.Surface;
78
import org.gvsig.fmap.geom.type.GeometryType;
79 65
import org.gvsig.tools.dynobject.exception.DynMethodException;
80
import org.gvsig.tools.logger.FilteredLogger;
81 66
import org.slf4j.Logger;
82 67
import org.slf4j.LoggerFactory;
83 68

  
......
144 129
    public static final String NAME_FIELD_LINK_MS = "LinkMS";
145 130
    public static final String NAME_FIELD_LINK_LENGTH = "LinkLength";
146 131
    public static final String NAME_FIELD_LINK_DATA = "LinkData";
132
    public static final String NAME_FIELD_DATA = "Data";
147 133

  
148 134
    private int ID_FIELD_ID;
149 135
    private int ID_FIELD_TYPE;
......
174 160
    private int ID_FIELD_LINK_MS;
175 161
    private int ID_FIELD_LINK_LENGTH;
176 162
    private int ID_FIELD_LINK_DATA;
163
    private int ID_FIELD_DATA;
177 164
    private int ID_FIELD_GEOMETRY;
178 165
    private int MAX_FIELD_ID;
179 166

  
......
274 261
        }
275 262
    }
276 263

  
264
    public static class TimeCounter {
265
        private static final Logger logger = LoggerFactory.getLogger(TimeCounter.class);
266
        
267
        private long counter = 0;
268
        private Date t1;
269
        private Date t2;
270
        
271
        public void start() {
272
            this.t1 = new Date();
273
            this.t2 = this.t1;
274
        }
275
        
276
        public void restart() {
277
            this.t1 = new Date();
278
            this.t2 = this.t1;
279
            this.counter = 0;
280
        }
281

  
282
        public void stop() {
283
            this.t2 = new Date();
284
            this.counter += this.t2.getTime()- this.t1.getTime();
285
        }
286
        public long get() {
287
            return this.counter;
288
        }
289
        public void log(String msg) {
290
            logger.debug("Time "+get()+" ms. " + msg);
291
        }
292
        public void restart(String msg) {
293
            this.stop();
294
            this.log(msg);
295
            this.restart();
296
        }
297
    }
298
    
277 299
    public void open() throws OpenException {
278 300
        if (this.data != null) {
279 301
            return;
......
281 303
        try {
282 304
            getResource().execute(new ResourceAction() {
283 305
                public Object run() throws Exception {
306
                    
307
                    TimeCounter tc = new TimeCounter();
308
                    tc.start();
309
                    
284 310
                    FeatureStoreProviderServices store = getStoreServices();
285 311
                    if (dgndata == null
286 312
                            && !(getDGNParameters().useReload())) {
......
291 317
                            resource.setData(new HashMap());
292 318
                        }
293 319
                    }
294

  
320
                    tc.restart("Retrive data from resource (data="+dgndata+")");
321
                    
295 322
                    if (dgndata == null) {
296 323
                        dgndata = new DGNData();
297 324
                        dgndata.data = new ArrayList();
......
331 358
                        ((Map) resource.getData()).put(
332 359
                                projection.getAbrev(),
333 360
                                dgndata); // OJO la reproyeccion
361
                        tc.restart("Loaded data from file (data="+dgndata+")");
334 362
                        resource.notifyClose();
335 363
                    }
336 364
                    // El feature type no lo compartimos entre las instancias del 
337 365
                    // mismo resource ya que puede cambiar en funcion del filtro.
338 366
                    // Por lo menos el geometry-type.
339 367
                    List<FeatureType> featureTypes = getFeatureTypes(store);
368

  
369
                    tc.restart("Created featuretype (featureTypes="+featureTypes+")");
340 370
                    
341 371
                    PostProcessFeatures postProcess = new PostProcessFeatures(
342 372
                            getDGNParameters(),
......
349 379
                        data = dgndata.data;
350 380
                        setDynValue("Envelope", dgndata.getEnvelopeCopy());
351 381
                    }
382
                    tc.restart("PostProcessFeatures");
383

  
352 384
                    legendBuilder = dgndata.legendBuilder;
353 385
                    store.setFeatureTypes(featureTypes, featureTypes.get(0));
354 386
                    setDynValue("CRS", projection);
355 387
                    counterNewsOIDs = data.size();
388
                    tc.restart("load finished.");
356 389
                    return null;
357 390
                }
358 391
            });
......
508 541
                .setDefaultValue("")
509 542
                .getIndex();
510 543

  
544
        ID_FIELD_DATA = featureType.add(NAME_FIELD_DATA, DataTypes.STRING, 512)
545
                .setDefaultValue("")
546
                .getIndex();
547

  
511 548
        EditableFeatureAttributeDescriptor attr = featureType.add(NAME_FIELD_GEOMETRY, DataTypes.GEOMETRY);
512 549
        attr.setSRS(this.projection);
513 550
        int geometryTypeToUse = getDGNParameters().getGeometryTypeFilter();
......
713 750
                    data.set(ID_FIELD_ROTATIONTEXT, 0);
714 751
                    data.set(ID_FIELD_TEXT, null);
715 752
                    data.set(ID_FIELD_SCALE, dgnReader.getInfo().scale);
753
                    data.set(ID_FIELD_DATA, elemento.getDataAsHexadecimal());
754
                    
716 755
                    if (parentElement == null) {
717 756
                        data.set(ID_FIELD_PARENT, elemento.getID());
718 757
                    } else {
......
743 782
                        data.set(ID_FIELD_LINK_DATA, "");
744 783
                    }
745 784

  
785
//                    if( elemento.getStyle()==3 && elemento.getLevel()==23 ) {
786
//                        logger.info("Un isopaco...");
787
//                    }
746 788
                    zvalue = 0;
747 789
                    try {
748 790
                        switch (elemento.stype) {
......
755 797
                                DGNElemMultiPoint dgnmultipoint = (DGNElemMultiPoint) elemento;
756 798
                                if (dgnmultipoint.isPoint()) {
757 799
                                    DGNPoint p = dgnmultipoint.getPoint(0);
758
                                    Point point = createPoint3D(p.getX(), p.getY(), ignoreZs ? 0 : p.getZ());
800
                                    Point point = createPoint(p.getX(), p.getY(), ignoreZs ? 0 : p.getZ());
759 801
                                    data.setDefaultGeometry(point);
760 802
                                    zvalue = p.getZ();
761 803
                                } else {
762 804
                                    OrientablePrimitive geom = null;
763 805
                                    if (dgnmultipoint.isPolygon()) {
764
                                        geom = geomManager.createSurface(
765
                                                dgnmultipoint.is3D()
766
                                                ? Geometry.SUBTYPES.GEOM3D
767
                                                : Geometry.SUBTYPES.GEOM2D
768
                                        );
806
                                        geom = geomManager.createSurface(getGeometrySubType(dgnmultipoint));
769 807
                                    } else {
770
                                        geom = geomManager.createCurve(
771
                                                dgnmultipoint.is3D()
772
                                                ? Geometry.SUBTYPES.GEOM3D
773
                                                : Geometry.SUBTYPES.GEOM2D
774
                                        );
808
                                        geom = geomManager.createCurve(getGeometrySubType(dgnmultipoint));
775 809
                                    }
776 810

  
777 811
                                    // Si es una curva nos saltamos los dos primeros y los dos ultimos vertices.
......
787 821
                                        for (int i = numVertices - 2; i >= first; i--) {
788 822
                                            DGNPoint p = dgnmultipoint.getVertex(i);
789 823
                                            zvalue = p.getZ();
790
                                            geom.addVertex(p.getX(), p.getY(), ignoreZs ? 0 : zvalue);
824
                                            addVertex(geom, p.getX(), p.getY(), ignoreZs ? 0 : zvalue);
791 825
                                        }
792 826
                                    } else {
793 827
                                        for (int i = first; i < numVertices; i++) {
794 828
                                            DGNPoint p = dgnmultipoint.getVertex(i);
795 829
                                            zvalue = p.getZ();
796
                                            geom.addVertex(p.getX(), p.getY(), ignoreZs ? 0 : zvalue);
830
                                            addVertex(geom,p.getX(), p.getY(), ignoreZs ? 0 : zvalue);
797 831
                                        }
798 832
                                    }
799 833
                                    data.setDefaultGeometry(geom);
......
840 874

  
841 875
                                Geometry geom = null;
842 876
                                if (dgnarc.isSurface()) {
843
                                    geom = geomManager.createSurface(elShapeArc,
844
                                            dgnarc.is3D()
845
                                            ? Geometry.SUBTYPES.GEOM3D
846
                                            : Geometry.SUBTYPES.GEOM2D
847
                                    );
877
                                    geom = geomManager.createSurface(elShapeArc,getGeometrySubType(dgnarc));
848 878
                                } else {
849
                                    geom = geomManager.createCurve(elShapeArc,
850
                                            dgnarc.is3D()
851
                                            ? Geometry.SUBTYPES.GEOM3D
852
                                            : Geometry.SUBTYPES.GEOM2D
853
                                    );
879
                                    geom = geomManager.createCurve(elShapeArc,getGeometrySubType(dgnarc));
854 880
                                }
855 881
                                data.setDefaultGeometry(geom);
856 882
                                break;
......
858 884
                            case DGNFileHeader.DGNST_TEXT:
859 885
                                DGNElemText dgntext = (DGNElemText) elemento;
860 886
                                zvalue = dgntext.getPoint().getZ();
861
                                Point point = createPoint3D(
887
                                Point point = createPoint(
862 888
                                        dgntext.getPoint().getX(),
863 889
                                        dgntext.getPoint().getY(),
864 890
                                        ignoreZs ? 0 : zvalue
......
908 934

  
909 935
        }
910 936

  
937
        private int getGeometrySubType(DGNElemCore element) {
938
            if( getDGNParameters().force2D() ) {
939
                return Geometry.SUBTYPES.GEOM2D;
940
            }
941
            return element.is3D()? Geometry.SUBTYPES.GEOM3D : Geometry.SUBTYPES.GEOM2D;
942
        }
943
        
944
        private void addVertex(OrientablePrimitive geom, double x, double y, double z) {
945
            if( geom.getDimension()==2 ) { 
946
                geom.addVertex(x, y);
947
            } else {
948
                geom.addVertex(x, y, z);
949
            }
950
        }
951
        
911 952
        private void fillRow(Object[] row, DGNElemCore elemento, DGNElemComplexHeader parentElement, DGNReader dgnReader) {
912 953
            row[ID_FIELD_HEIGHTTEXT] = new Double(0);
913 954
            row[ID_FIELD_HEIGHTTEXTRAW] = new Double(0);
......
1159 1200
                                    && (psLine.vertices[0].y == psLine.vertices[1].y)) {
1160 1201
                                auxRow[ID_FIELD_ENTITY] = "Point";
1161 1202
                                addShape(
1162
                                        createPoint3D(psLine.vertices[0].x,
1203
                                        createPoint(psLine.vertices[0].x,
1163 1204
                                                psLine.vertices[0].y,
1164 1205
                                                psLine.vertices[0].z), auxRow,
1165 1206
                                        type, dgnReader);
......
1335 1376
                        case DGNFileHeader.DGNST_TEXT:
1336 1377

  
1337 1378
                            DGNElemText psText = (DGNElemText) elemento;
1338
                            Geometry elShapeTxt = createPoint3D(psText.origin.x,
1379
                            Geometry elShapeTxt = createPoint(psText.origin.x,
1339 1380
                                    psText.origin.y, psText.origin.z);
1340 1381

  
1341 1382
                            fillRow(auxRow, elemento, parentElement, dgnReader);
......
1402 1443
            }
1403 1444

  
1404 1445
        }
1405
//
1406
//        private Curve createCurve(boolean is3D) throws CreateGeometryException {
1407
//            if (is3D) {
1408
//                return (Curve) geomManager.create(
1409
//                        Geometry.TYPES.CURVE,
1410
//                        Geometry.SUBTYPES.GEOM3D);
1411
//            }
1412
//            return (Curve) geomManager.create(
1413
//                    Geometry.TYPES.CURVE,
1414
//                    Geometry.SUBTYPES.GEOM2D);
1415
//
1416
//        }
1417 1446

  
1418
        private Point createPoint3D(double x, double y, double z)
1447
        private Point createPoint(double x, double y, double z)
1419 1448
                throws DataException {
1420 1449
            Point point;
1450
            int subtype = SUBTYPES.GEOM3D;
1451
            if( getDGNParameters().force2D() ) {
1452
                subtype = SUBTYPES.GEOM2D;
1453
            }
1421 1454
            try {
1422
                // point = (Point) geomManager.create(TYPES.POINT,
1423
                // SUBTYPES.GEOM3D);
1424
                point = (Point) geomManager.create(TYPES.POINT,
1425
                        SUBTYPES.GEOM3D);
1455
                point = (Point) geomManager.create(TYPES.POINT,subtype);
1426 1456
            } catch (CreateGeometryException e) {
1427
                throw new org.gvsig.fmap.dal.feature.exception.CreateGeometryException(
1428
                        e);
1457
                throw new org.gvsig.fmap.dal.feature.exception.CreateGeometryException(e);
1429 1458
            }
1430 1459
            point.setCoordinates(new double[]{x, y, z});
1431 1460

  
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/PostProcessFeatures.java
3 3
import java.util.ArrayList;
4 4
import java.util.Collections;
5 5
import java.util.Comparator;
6
import java.util.Date;
7 6
import java.util.Iterator;
8 7
import java.util.List;
9 8
import org.gvsig.fmap.dal.feature.FeatureType;
10 9
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
10
import org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.TimeCounter;
11 11
import org.gvsig.fmap.geom.Geometry;
12 12
import org.gvsig.fmap.geom.GeometryLocator;
13 13
import org.gvsig.fmap.geom.GeometryManager;
......
52 52

  
53 53
    public List<FeatureProvider> apply(List<FeatureProvider> rows) throws CreateEnvelopeException {
54 54

  
55
        TimeCounter tc_total = new TimeCounter();
56
        TimeCounter tc_accept = new TimeCounter();
57

  
55 58
        PostProcessFilterOperation filter = this.getFilter();
56 59

  
57 60
        List<FeatureProvider> result = null;
......
64 67
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
65 68
            this.envelope = geomManager.createEnvelope(this.geomSubtype);
66 69

  
67
            Date t1 = new Date();
68

  
70
            tc_total.start();
69 71
            result = new ArrayList<FeatureProvider>();
70 72
            while (rowsIterator.hasNext()) {
71 73
                FeatureProvider feature = rowsIterator.next();
72 74
                rowCount++;
73
                if (!filter.accept(feature)) {
75
                
76
                tc_accept.start();
77
                boolean accept = filter.accept(feature);
78
                tc_accept.stop();
79
                
80
                if (!accept) {
74 81
                    continue;
75 82
                }
76 83
                rowFitereds++;
......
80 87
                }
81 88
                result.add(feature);
82 89
            }
90
            tc_total.stop();
91
            tc_accept.log("Accepts time filter");
92
            tc_total.log("Total time filer, rows input "+rowCount+", output "+rowFitereds );
83 93

  
84
            Date t2 = new Date();
85
            logger.debug("Time to filter data " + (t2.getTime() - t1.getTime())+", total rows "+rowCount+", output rows "+rowFitereds);
86

  
87 94
        } else {
88
            Date t1 = new Date();
95
            tc_total.start();
89 96

  
90 97
            PostProcessGroupOperation groupOperation = new PostProcessGroupOperation(
91 98
                    this.featureType,
......
95 102
            while (rowsIterator.hasNext()) {
96 103
                FeatureProvider feature = rowsIterator.next();
97 104
                rowCount++;
98
                if (!filter.accept(feature)) {
105

  
106
                tc_accept.start();
107
                boolean accept = filter.accept(feature);
108
                tc_accept.stop();
109
                
110
                if (!accept) {
99 111
                    continue;
100 112
                }
101 113
                rowFitereds++;
......
104 116
            result = groupOperation.getRows();
105 117
            this.envelope = groupOperation.getEnvelope();
106 118

  
107
            Date t2 = new Date();
108
            logger.debug("Time to filter+group data " + (t2.getTime() - t1.getTime())+", total rows "+rowCount+", output rows "+rowFitereds);
119
            tc_total.stop();
120
            tc_accept.log("Accepts time filter+group");
121
            tc_total.log("Total time filer+group, rows input "+rowCount+", output "+rowFitereds );
109 122
        }
110 123

  
111 124
        if (parameters.sortByGeometryType()) {
......
119 132
    }
120 133

  
121 134
    private void sortRows(List<FeatureProvider> rows) {
122
        Date t1 = new Date();
135
        TimeCounter tc = new TimeCounter();
123 136
        Collections.sort(rows, new Comparator<FeatureProvider>() {
124 137
            public int compare(FeatureProvider o1, FeatureProvider o2) {
125 138
                Geometry g1 = o1.getDefaultGeometry();
......
136 149
                return g2.getType() - g1.getType();
137 150
            }
138 151
        });
139
        Date t2 = new Date();
140
        logger.debug("Time to sort data " + (t2.getTime() - t1.getTime())+", rows "+rows.size());
152
        tc.stop();
153
        tc.log("sort data, rows "+rows.size());
141 154
    }
142 155

  
143 156
    public boolean hasOperations() {

Also available in: Unified diff