Revision 1058

View differences:

org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
  <modelVersion>4.0.0</modelVersion>
4
  <artifactId>org.gvsig.jexcel.app</artifactId>
5
  <packaging>pom</packaging>
6
  <name>${project.artifactId}</name>
7
  <parent>
8
      <groupId>org.gvsig</groupId>
9
      <artifactId>org.gvsig.jexcel</artifactId>
10
      <version>1.0.135</version>
11
  </parent>
12

  
13
  <modules>
14
    <module>org.gvsig.jexcel.app.mainplugin</module>
15
  </modules>
16

  
17

  
18
</project>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/buildNumber.properties
1
#Wed Jun 30 17:42:47 CEST 2021
2
buildNumber=139
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/resources-plugin/test1.txt
1
>>> from  jxl import Workbook
2
>>> Workbook.getWorkbook
3
<java function getWorkbook 1>
4
>>> from java.io import File
5
>>> f=File("/home/usuario/datos/geodata/tables/torrent_4-es-excel2003.xls")
6
>>> f.exists()
7
1
8
>>> w=Workbook.getWorkbook(f)
9
>>> dir(w)
10
['XCTRecords', 'addInFunctionNames', 'buttonPropertySet', 'class', 'close', 'compoundFile', 'containsMacros', 'countryRecord', 'createWorkbook', 'drawingGroup', 'equals', 'externalSheetRecord', 'findByName', 'findCellByName', 'fonts', 'formattingRecords', 'getAddInFunctionNames', 'getButtonPropertySet', 'getCell', 'getClass', 'getCompoundFile', 'getCountryRecord', 'getDrawingGroup', 'getExternalSheetIndex', 'getExternalSheetName', 'getExternalSheetRecord', 'getFonts', 'getFormattingRecords', 'getIndex', 'getLastExternalSheetIndex', 'getLastExternalSheetName', 'getMsoDrawingGroupRecord', 'getName', 'getNameIndex', 'getNameRecords', 'getNumberOfSheets', 'getRangeNames', 'getReadSheet', 'getSettings', 'getSheet', 'getSheetNames', 'getSheets', 'getSupbookRecords', 'getVersion', 'getWorkbook', 'getWorkbookBof', 'getXCTRecords', 'hashCode', 'isProtected', 'msoDrawingGroupRecord', 'nameRecords', 'notify', 'notifyAll', 'numberOfSheets', 'protected', 'rangeNames', 'settings', 'sheetNames', 'sheets', 'supbookRecords', 'toString', 'wait', 'workbookBof']
11
>>> w.numberOfSheets
12
1
13
>>> w.sheetNames
14
array(java.lang.String,['Hoja1']) 
15
>>> w.sheets
16
array(jxl.Sheet,[jxl.read.biff.SheetImpl@3a4f51e8]) 
17
>>> s=w.sheets[0]
18
>>> s
19
jxl.read.biff.SheetImpl@3a4f51e8
20
>>> dir(s)
21
['PLS', 'autoFilter', 'buttonPropertySet', 'charts', 'class', 'columnInfos', 'columnPageBreaks', 'columns', 'conditionalFormats', 'dataValidation', 'drawingData', 'drawings', 'equals', 'findCell', 'findLabelCell', 'getAutoFilter', 'getButtonPropertySet', 'getCell', 'getCharts', 'getClass', 'getColumn', 'getColumnFormat', 'getColumnInfo', 'getColumnInfos', 'getColumnPageBreaks', 'getColumnView', 'getColumnWidth', 'getColumns', 'getConditionalFormats', 'getDataValidation', 'getDrawing', 'getDrawingData', 'getDrawings', 'getHyperlinks', 'getMaxColumnOutlineLevel', 'getMaxRowOutlineLevel', 'getMergedCells', 'getName', 'getNumberOfImages', 'getPLS', 'getRow', 'getRowHeight', 'getRowPageBreaks', 'getRowProperties', 'getRowView', 'getRows', 'getSettings', 'getSheetBof', 'getWorkbook', 'getWorkbookBof', 'getWorkspaceOptions', 'hashCode', 'hidden', 'hyperlinks', 'isHidden', 'isProtected', 'maxColumnOutlineLevel', 'maxRowOutlineLevel', 'mergedCells', 'name', 'notify', 'notifyAll', 'numberOfImages', 'protected', 'rowPageBreaks', 'rowProperties', 'rows', 'settings', 'sheetBof', 'toString', 'wait', 'workbook', 'workbookBof', 'workspaceOptions']
22
>>> 
23
>>> s.getRows()
24
382
25
>>> s.columns
26
5
27
>>> 
28
>>> c=s.getCell(0,0)
29
>>> dir(c)
30
['XFIndex', 'cellFeatures', 'cellFormat', 'class', 'column', 'contents', 'equals', 'getCellFeatures', 'getCellFormat', 'getClass', 'getColumn', 'getContents', 'getRow', 'getString', 'getType', 'getXFIndex', 'hashCode', 'hidden', 'isHidden', 'notify', 'notifyAll', 'row', 'setCellFeatures', 'string', 'toString', 'type', 'wait']
31
>>> 
32
>>> c.toString()
33
'jxl.read.biff.LabelSSTRecord@14a614b5'
34
>>> c.contents
35
'B1'
36
>>> 
37
>>> s.getCell(0,s.getRows()-1)
38
jxl.read.biff.NumberValue@3e803098
39
>>> s.getCell(s.columns-1,s.getRows()-1)
40
jxl.read.biff.LabelSSTRecord@56dc16be
41
>>> s.getCell(s.columns-1,s.getRows()-1).contents
42
'R'
43
>>> 
44

  
45

  
46

  
47

  
48

  
49

  
50

  
51

  
52

  
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/resources-plugin/config.xml
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<plugin-config>
3
  <libraries library-dir="lib/"/>
4
  <depends plugin-name="org.gvsig.app.mainplugin"/>
5
  <resourceBundle name="text"/>
6
  <extensions>
7
     <extension class-name="org.gvsig.andami.LibraryExtension" active="false"/>
8
  </extensions>
9
</plugin-config>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
1
<assembly>
2
  <id>gvsig-plugin-package</id>
3
  <formats>
4
    <format>zip</format>
5
  </formats>
6
  <baseDirectory>${project.artifactId}</baseDirectory>
7
  <includeBaseDirectory>true</includeBaseDirectory>
8
  <files>
9
    <file>
10
      <source>target/${project.artifactId}-${project.version}.jar</source>
11
      <outputDirectory>lib</outputDirectory>
12
    </file>
13
    <file>
14
      <source>target/package.info</source>
15
    </file>
16
  </files>
17

  
18
  <fileSets>
19
    <fileSet>
20
      <directory>src/main/resources-plugin</directory>
21
      <outputDirectory>.</outputDirectory>
22
    </fileSet>
23
  </fileSets>
24

  
25
  <dependencySets>
26
  
27
    <dependencySet>
28
      <useProjectArtifact>false</useProjectArtifact>
29
      <useTransitiveDependencies>false</useTransitiveDependencies>
30
      <outputDirectory>lib</outputDirectory>
31
      <includes>
32
        <include>net.sourceforge.jexcelapi:jxl</include>
33
        <include>org.gvsig:org.gvsig.jexcel.provider</include>        
34
      </includes>
35
    </dependencySet>
36
    
37
  </dependencySets>
38

  
39
</assembly>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/userdoc/user_manual.rst
1
jexcel plugin user manual v0.2
2
=================================
3

  
4
.. contents:: Contents
5

  
6
Introduction
7
--------------
8

  
9
The jexcel plugin add to gvSIG the following functionalities:
10

  
11
* Load Microsoft Excel spreadsheets as tables.
12
* Load Microsoft Excel spreadsheets as layers.
13
* Export a table to Excel spreadsheet format.
14

  
15
It supports the following Excel spreadsheet versions:
16

  
17
* Reading: Excel 95, 97, 2000, XP, and 2003 workbooks.
18
* Writing: Excel 2000
19

  
20
Installation
21
--------------
22

  
23
(TODO)
24

  
25
Loading a table from an Excel spreadsheet
26
------------------------------------------
27

  
28
From the gvSIG project manager, select the “Table” document (1) and click on “New” (2). In the “New table” window the “File” tab is selected by default. Click on “Add” (3) and find the Excel file that contains the spreadsheet you want to load (4). Finally click on “Open” (5).
29

  
30
|
31

  
32
.. image:: Selection_088.png
33
  :align: center
34
  :scale: 150
35

  
36
Once the file appears in the “New table” window, click on “Properties” (7) in order to set up the following parameters:
37

  
38
Data source properties
39
+++++++++++++++++++++++
40

  
41
General tab (default)
42
^^^^^^^^^^^^^^^^^^^^^^
43

  
44
 - **File:** File path.
45
 - **Locale:** Localization configuration. This determines the characters used as decimal and thousands separators.
46
 - **Sheet to load:** Position within the spreadsheet file of the sheet that we want to load. First position corresponds with the number "0", second with "1" and so on.
47
 - **Use first row as header:** In case this option is checked it will consider the first row values as the field names.
48
 - **CRS:** In case the sheet contains coordinates this parameter sets its Coordinate Reference System.
49
 - **Point (X,Y,Z):** Position of the fields that contains the coordinates. It should be provided at least two fields for X,Y coordinates.
50

  
51
|
52

  
53
.. image:: Selection_091.png
54
  :align: center
55
  :scale: 150
56

  
57
Advanced tab
58
^^^^^^^^^^^^^^
59

  
60
 - **ProviderName:** The provider name (internal use).
61
 - **Header:** In case the sheet doesn't have a header we can define it here. We have to type the name of the fields separated by a comma.
62
 - **Field types:** The is useful if we want to force the program to load the table with a specific field types. 
63
 - **Automatic types detection:** This options is checked by default. It tryes to figure out what the field types are. 
64
 - **Ignore errors:** This option forces the program to load the table even in case it finds erros.
65

  
66
|
67

  
68
.. image:: Selection_090.png
69
  :align: center
70
  :scale: 150
71

  
72
Once all the needed parameters have been set up click on “Accept” and finally on “Ok”. If everything worked fine the table should appear.
73

  
74
|
75

  
76
.. image:: Selection_092.png
77
  :align: center
78
  :scale: 150
79

  
80
Loading a layer from an Excel Spreadsheet
81
------------------------------------------
82

  
83
From the gvSIG project manager, select the “View” document (1) and click on “New” (2). In the “Add layer” window the “File” tab is selected by default. Click on “Add” (4) and find the Excel file that contains the spreadsheet you want to load (5). Finally click on “Open” (6).
84

  
85
|
86

  
87
.. image:: Selection_095.png
88
  :align: center
89
  :scale: 150
90

  
91
Once the file appears in the “Add layer” window, click on “Properties” (7) in order to set up the following parameters:
92

  
93
Data source properties
94
+++++++++++++++++++++++
95

  
96
General tab (default)
97
^^^^^^^^^^^^^^^^^^^^^^
98

  
99
 - **File:** File path.
100
 - **Locale:** Localization configuration. This determines the characters used as decimal and thousands separators.
101
 - **Sheet to load:** Position within the spreadsheet file of the sheet that we want to load. First position corresponds with the number "0", second with "1" and so on.
102
 - **Use first row as header:** In case this option is checked it will consider the first row values as the field names.
103
 - **CRS:** In case the sheet contains coordinates this parameter sets its Coordinate Reference System.
104
 - **Point (X,Y,Z):** Position of the fields that contains the coordinates. It should be provided at least two fields for X,Y coordinates.
105

  
106
|
107

  
108
.. image:: Selection_096.png
109
  :align: center
110
  :scale: 150
111

  
112
Advanced tab
113
^^^^^^^^^^^^^^
114

  
115
 - **ProviderName:** The provider name (internal use).
116
 - **Header:** In case the sheet doesn't have a header we can define it here. We have to type the name of the fields separated by a comma.
117
 - **Field types:** The is useful if we want to force the program to load the table with a specific field types. 
118
 - **Automatic types detection:** This options is checked by default. It tryes to figure out what the field types are. 
119
 - **Ignore errors:** This option forces the program to load the table even in case it finds erros.
120

  
121
|
122

  
123
.. image:: Selection_097.png
124
  :align: center
125
  :scale: 150
126

  
127
Once all the needed parameters have been set up click on “Accept” and finally on “Ok”. If everything worked fine the layer should appear in the view.
128

  
129
|
130

  
131
.. image:: Selection_098.png
132
  :align: center
133
  :scale: 150
134

  
135
Exporting a table to Excel spreadsheet format
136
----------------------------------------------
137

  
138
(TODO)
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
    <modelVersion>4.0.0</modelVersion>
4
    <artifactId>org.gvsig.jexcel.app.mainplugin</artifactId>
5
    <packaging>jar</packaging>
6
    <name>${project.artifactId}</name>
7
    <description>Excel file format support</description>
8
    <parent>
9
        <groupId>org.gvsig</groupId>
10
        <artifactId>org.gvsig.jexcel.app</artifactId>
11
        <version>1.0.135</version>
12
    </parent>
13

  
14
    <dependencies>
15
        <dependency>
16
            <groupId>org.gvsig</groupId>
17
            <artifactId>org.gvsig.tools.lib</artifactId>
18
            <scope>compile</scope>
19
        </dependency>
20
        <dependency>
21
            <groupId>org.gvsig</groupId>
22
            <artifactId>org.gvsig.andami</artifactId>
23
            <scope>compile</scope>
24
        </dependency>
25
        <dependency>
26
            <groupId>org.gvsig</groupId>
27
            <artifactId>org.gvsig.jexcel.provider</artifactId>
28
            <scope>compile</scope>
29
        </dependency>
30

  
31
        <dependency>
32
            <groupId>net.sourceforge.jexcelapi</groupId>
33
            <artifactId>jxl</artifactId>
34
            <scope>compile</scope>
35
        </dependency>
36

  
37
    </dependencies>
38

  
39
    <properties>
40
        <!-- Package info property values -->
41
        <!-- Default values in org.gvsig.desktop -->
42
        <gvsig.package.info.name>Formats: Excel file format support</gvsig.package.info.name>
43
        <gvsig.package.info.state>testing</gvsig.package.info.state>
44
        <gvsig.package.info.official>true</gvsig.package.info.official>
45
        <gvsig.package.info.dependencies>required: org.gvsig.app.mainplugin -ge 2.1.0-A</gvsig.package.info.dependencies>
46
        <gvsig.package.info.categories>Formats,Vector</gvsig.package.info.categories>
47
        <gvsig.package.info.poolURL>https://devel.gvsig.org/download/projects/gvsig-jexcel/pool/</gvsig.package.info.poolURL>
48
    </properties>
49

  
50
</project>
0 51

  
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/JExcelSpread.java
1
package org.gvsig.jexcel;
2

  
3
import java.io.File;
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.Collections;
7
import java.util.List;
8
import java.util.Locale;
9
import java.util.Objects;
10
import org.apache.commons.lang3.StringUtils;
11
import java.awt.Rectangle;
12
import java.util.Arrays;
13
import jxl.Cell;
14
import jxl.Workbook;
15
import org.slf4j.Logger;
16
import org.slf4j.LoggerFactory;
17

  
18
/**
19
 *
20
 * @author jjdelcerro
21
 */
22
@SuppressWarnings("UseSpecificCatch")
23
public class JExcelSpread implements Spread {
24

  
25
    private static final Logger LOGGER = LoggerFactory.getLogger(JExcelSpread.class);
26
    
27
    private static class SheetJExcel implements Sheet {
28

  
29
        private final Workbook workbook;        
30
        private final File spreadFile;
31
        private final int sheetIndex;
32
        private final jxl.Sheet sheetExcel;
33

  
34
        public SheetJExcel(File spreadFile, int sheetIndex) throws IOException {
35
            try {
36
                this.spreadFile = spreadFile;
37
                this.sheetIndex = sheetIndex;
38
                this.workbook = Workbook.getWorkbook(spreadFile);
39
                this.sheetExcel = this.workbook.getSheet(sheetIndex);
40
            } catch (Exception ex) {
41
                throw new IOException("Can't open sheet "+sheetIndex+" from '"+Objects.toString(spreadFile)+"'.", ex);
42
            }
43
        }
44

  
45
        @Override
46
        public int getColumnCount() {
47
            return this.sheetExcel.getColumns();
48
        }
49

  
50
        @Override
51
        public Rectangle getUsedRange() {
52
            return null;
53
        }
54
        
55
        @Override
56
        public List<String> getColumnNames(boolean isFirstLineHedaer) {
57
            int columns = this.getColumnCount();
58
            List<String> columnNames = new ArrayList<>(columns);
59

  
60
            String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
61
            if (columns > abc.length()) {
62
                for (int i = 0; i < columns; i++) {
63
                    columnNames.add("C" + i);
64
                }
65
            } else {
66
                for (int i = 0; i < columns; i++) {
67
                    columnNames.add(abc.substring(i, i + 1));
68
                }
69
            }
70
            if (isFirstLineHedaer) {
71
                for (int col = 0; col < columns; col++) {
72
                    Object value = this.getValueAt(col, 0);
73
                    String s = Objects.toString(value);
74
                    if (!StringUtils.isBlank(s)) {
75
                        columnNames.set(col, s);
76
                    }
77
                }
78
            }
79
            return columnNames;
80
        }
81

  
82
        @Override
83
        public File getFile() {
84
            return this.spreadFile;
85
        }
86

  
87
        @Override
88
        public String getName() {
89
            return this.sheetExcel.getName();
90
        }
91

  
92
        @Override
93
        public int getRowCount() {
94
            return this.sheetExcel.getRows();
95
        }
96

  
97
        @Override
98
        public int getSheetIndex() {
99
            return this.sheetIndex;
100
        }
101

  
102
        @Override
103
        public Object getValueAt(int col, int row) {
104
            Cell cell = this.sheetExcel.getCell(col, row);
105
            Object value = cell.getContents();
106
            return value;
107
        }
108

  
109
    }
110

  
111
    private File spreadFile;
112

  
113
    public JExcelSpread() {
114

  
115
    }
116

  
117
    @Override
118
    public void open(File spreadFile) {
119
        this.spreadFile = spreadFile;
120
    }
121

  
122
    @Override
123
    public File getFile() {
124
        return this.spreadFile;
125
    }
126

  
127
    @Override
128
    public Sheet getSheet(int sheetIndex) {
129
        try {
130
            if (spreadFile == null || sheetIndex < 0) {
131
                return null;
132
            }
133
            return new SheetJExcel(spreadFile, sheetIndex);
134
        } catch (IOException ex) {
135
            return null;
136
        }
137
    }
138

  
139
    @Override
140
    public List<String> getSheetNames() {
141
        try {
142
            List<String> r = new ArrayList<>();
143
            Workbook workbook = Workbook.getWorkbook(spreadFile);
144
            r.addAll(Arrays.asList(workbook.getSheetNames()));
145
            return r;
146
        } catch (Exception ex) {
147
            return Collections.EMPTY_LIST;
148
        }
149
    }
150

  
151
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/Spread.java
1
package org.gvsig.jexcel;
2

  
3
import java.awt.Rectangle;
4
import java.io.File;
5
import java.util.List;
6

  
7
/**
8
 *
9
 * @author jjdelcerro
10
 */
11
public interface Spread {
12

  
13
    public static String NAME = "Excel";
14

  
15
    public static Spread create(File file, Object... args) {
16
        JExcelSpread spread = new JExcelSpread();
17
        spread.open(file);
18
        return spread;
19
    }
20

  
21
    public interface Sheet {
22

  
23
        int getColumnCount();
24

  
25
        List<String> getColumnNames(boolean isFirstLineHedaer);
26

  
27
        File getFile();
28

  
29
        String getName();
30

  
31
        int getRowCount();
32

  
33
        int getSheetIndex();
34

  
35
        Object getValueAt(int col, int row);
36

  
37
        public Rectangle getUsedRange();
38
    }
39

  
40
    public void open(File spreadFile);
41

  
42
    public File getFile();
43

  
44
    public Sheet getSheet(int sheetIndex);
45

  
46
    public List<String> getSheetNames();
47
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/JExcelLibrary.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.jexcel;
25

  
26
import java.util.ArrayList;
27
import java.util.List;
28

  
29
import org.gvsig.fmap.dal.DALFileLibrary;
30
import org.gvsig.fmap.dal.DALFileLocator;
31
import org.gvsig.fmap.dal.DALLibrary;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.FileHelper;
34
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
35
import org.gvsig.jexcel.dal.provider.JExcelFilesystemServerProvider;
36
import org.gvsig.jexcel.dal.provider.JExcelStoreParameters;
37
import org.gvsig.jexcel.dal.provider.JExcelStoreProvider;
38
import org.gvsig.jexcel.dal.provider.JExcelStoreProviderFactory;
39
import org.gvsig.jexcel.dynformfield.point.JDynFormFieldExcelPointFieldsFactory;
40
import org.gvsig.jexcel.dynformfield.sheet.JDynFormFieldExcelSheetFactory;
41
import org.gvsig.metadata.exceptions.MetadataException;
42
import org.gvsig.tools.dynform.spi.DynFormSPILocator;
43
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
44
import org.gvsig.tools.library.AbstractLibrary;
45
import org.gvsig.tools.library.LibraryException;
46

  
47
public class JExcelLibrary extends AbstractLibrary {
48

  
49
    @Override
50
    public void doRegistration() {
51
        registerAsServiceOf(DALLibrary.class);
52
        require(DALFileLibrary.class);
53
    }
54

  
55
    @Override
56
    protected void doInitialize() throws LibraryException {
57
    }
58

  
59
    @Override
60
    protected void doPostInitialize() throws LibraryException {
61
        List<Throwable> exs = new ArrayList<Throwable>();
62

  
63
        FileHelper.registerParametersDefinition(
64
                JExcelStoreParameters.PARAMETERS_DEFINITION_NAME,
65
                JExcelStoreParameters.class, "JExcelParameters.xml");
66
        try {
67
            FileHelper.registerMetadataDefinition(
68
                    JExcelStoreProvider.METADATA_DEFINITION_NAME,
69
                    JExcelStoreProvider.class, "JExcelMetadata.xml");
70
        } catch (MetadataException e) {
71
            exs.add(e);
72
        }
73

  
74
        DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator
75
                .getDataManager();
76

  
77
        try {
78
            if (!dataman.getStoreProviders().contains(JExcelStoreProvider.NAME)) {
79
                dataman.registerStoreProviderFactory(new JExcelStoreProviderFactory(JExcelStoreProvider.NAME, JExcelStoreProvider.DESCRIPTION));
80

  
81
            }
82
        } catch (RuntimeException e) {
83
            exs.add(e);
84
        }
85

  
86
        try {
87
            DALFileLocator.getFilesystemServerExplorerManager()
88
                    .registerProvider(JExcelStoreProvider.NAME,
89
                            JExcelStoreProvider.DESCRIPTION,
90
                            JExcelFilesystemServerProvider.class);
91
        } catch (RuntimeException e) {
92
            exs.add(e);
93
        }
94

  
95
        DynFormSPIManager manager = DynFormSPILocator.getDynFormSPIManager();
96
        manager.registerDynFieldFactory(new JDynFormFieldExcelSheetFactory());
97
        manager.registerDynFieldFactory(new JDynFormFieldExcelPointFieldsFactory());
98

  
99
        if (exs.size() > 0) {
100
            throw new LibraryException(this.getClass(), exs);
101
        }
102
    }
103
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/dal/provider/JExcelFilesystemServerProvider.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.jexcel.dal.provider;
25

  
26
import java.io.File;
27

  
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30
import org.gvsig.fmap.dal.DataServerExplorer;
31
import org.gvsig.fmap.dal.DataStoreParameters;
32
import org.gvsig.fmap.dal.NewDataStoreParameters;
33
import org.gvsig.fmap.dal.exception.CreateException;
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.exception.FileNotFoundException;
36
import org.gvsig.fmap.dal.exception.RemoveException;
37
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
38
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
39
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
40
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
41
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
42

  
43
public class JExcelFilesystemServerProvider extends AbstractFilesystemServerExplorerProvider 
44
	implements FilesystemServerExplorerProvider, ResourceConsumer {
45

  
46
	private FilesystemServerExplorerProviderServices serverExplorer;
47

  
48
	public String getDataStoreProviderName() {
49
		return JExcelStoreProvider.NAME;
50
	}
51

  
52
	public int getMode() {
53
		return DataServerExplorer.MODE_FEATURE | DataServerExplorer.MODE_GEOMETRY;
54
	}
55

  
56
	public boolean accept(File pathname) {
57
		return (pathname.getName().toLowerCase().endsWith(".xls"));
58
	}
59

  
60
	public String getDescription() {
61
		return JExcelStoreProvider.DESCRIPTION;
62
	}
63

  
64
	public DataStoreParameters getParameters(File file) throws DataException {
65
		DataManager manager = DALLocator.getDataManager();
66
		JExcelStoreParameters params = (JExcelStoreParameters) manager
67
				.createStoreParameters(this
68
				.getDataStoreProviderName());
69
		params.setFile(file);
70
		return params;
71
	}
72

  
73
	public boolean canCreate() {
74
		return false;
75
	}
76

  
77
	public boolean canCreate(NewDataStoreParameters parameters) {
78
			throw new UnsupportedOperationException(); 
79
	}
80

  
81
	public void create(NewDataStoreParameters parameters, boolean overwrite)
82
			throws CreateException {
83
		throw new UnsupportedOperationException(); 
84
	}
85

  
86
	public NewDataStoreParameters getCreateParameters() throws DataException {
87
		throw new UnsupportedOperationException(); 
88
	}
89

  
90
	public void initialize(
91
			FilesystemServerExplorerProviderServices serverExplorer) {
92
		this.serverExplorer = serverExplorer;
93
	}
94

  
95
	public void remove(DataStoreParameters parameters) throws RemoveException {
96
		File file = ((JExcelStoreParameters) parameters).getFile();
97
		if (!file.exists()) {
98
			throw new RemoveException(this.getDataStoreProviderName(),
99
					new FileNotFoundException(file));
100
		}
101
		if (!file.delete()) {
102
			// FIXME throws ???
103
		}
104

  
105
	}
106

  
107
	public boolean closeResourceRequested(ResourceProvider resource) {
108
		// while it is using a resource anyone can't close it
109
		return false;
110
	}
111

  
112
	public void resourceChanged(ResourceProvider resource) {
113
		//Do nothing
114

  
115
	}
116

  
117

  
118
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.135/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/dal/provider/JExcelStoreProvider.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA 02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.jexcel.dal.provider;
25

  
26
import java.io.File;
27
import java.io.IOException;
28
import java.text.SimpleDateFormat;
29
import java.util.ArrayList;
30
import java.util.HashMap;
31
import java.util.Iterator;
32
import java.util.List;
33
import java.util.Locale;
34
import javax.json.JsonObject;
35
import jxl.Cell;
36
import jxl.Sheet;
37
import jxl.Workbook;
38
import jxl.read.biff.BiffException;
39

  
40
import org.apache.commons.io.FilenameUtils;
41
import org.apache.commons.lang3.StringUtils;
42
import org.cresques.cts.IProjection;
43
import org.gvsig.fmap.dal.DALLocator;
44
import org.gvsig.fmap.dal.DataManager;
45
import org.gvsig.fmap.dal.DataServerExplorer;
46
import org.gvsig.fmap.dal.DataStore;
47
import org.gvsig.fmap.dal.DataStoreNotification;
48
import org.gvsig.fmap.dal.DataTypes;
49
import org.gvsig.fmap.dal.FileHelper;
50
import org.gvsig.fmap.dal.exception.DataException;
51
import org.gvsig.fmap.dal.exception.InitializeException;
52
import org.gvsig.fmap.dal.exception.OpenException;
53
import org.gvsig.fmap.dal.exception.ReadException;
54
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
55
import org.gvsig.fmap.dal.feature.EditableFeature;
56
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
57
import org.gvsig.fmap.dal.feature.EditableFeatureType;
58
import org.gvsig.fmap.dal.feature.Feature;
59
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
60
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
61
import org.gvsig.fmap.dal.feature.FeatureStore;
62
import org.gvsig.fmap.dal.feature.FeatureType;
63
import org.gvsig.fmap.dal.feature.exception.PerformEditingException;
64
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
65
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
66
import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider;
67
import org.gvsig.fmap.dal.resource.file.FileResource;
68
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
69
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
70
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
71
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
72
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
73
import org.gvsig.fmap.geom.Geometry;
74
import org.gvsig.fmap.geom.GeometryLocator;
75
import org.gvsig.fmap.geom.GeometryManager;
76
import org.gvsig.fmap.geom.aggregate.MultiPoint;
77
import org.gvsig.fmap.geom.primitive.Envelope;
78
import org.gvsig.fmap.geom.primitive.Point;
79
import org.gvsig.fmap.geom.type.GeometryType;
80
import org.gvsig.json.Json;
81
import org.gvsig.json.JsonObjectBuilder;
82
import org.gvsig.tools.ToolsLocator;
83
import org.gvsig.tools.dataTypes.Coercion;
84
import org.gvsig.tools.dataTypes.CoercionException;
85
import org.gvsig.tools.dataTypes.DataType;
86
import org.gvsig.tools.dataTypes.DataTypesManager;
87
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
88
import org.gvsig.tools.exception.BaseException;
89
import org.gvsig.tools.exception.NotYetImplemented;
90
import org.gvsig.tools.logger.FilteredLogger;
91
import org.gvsig.tools.persistence.PersistentState;
92
import org.gvsig.tools.persistence.exception.PersistenceException;
93
import org.gvsig.tools.task.SimpleTaskStatus;
94
import org.gvsig.tools.task.TaskStatusManager;
95
import org.gvsig.tools.visitor.VisitCanceledException;
96
import org.gvsig.tools.visitor.Visitor;
97
import org.slf4j.Logger;
98
import org.slf4j.LoggerFactory;
99

  
100
@SuppressWarnings("UseSpecificCatch")
101
public class JExcelStoreProvider extends AbstractMemoryStoreProvider implements
102
        ResourceConsumer {
103

  
104
    private static final Logger logger = LoggerFactory.getLogger(JExcelStoreProvider.class);
105

  
106
    public static final String NAME = "JExcel";
107
    public static final String DESCRIPTION = "JExcel file";
108

  
109
    public static final String METADATA_DEFINITION_NAME = NAME;
110

  
111
    private ResourceProvider resource;
112

  
113
    private long counterNewsOIDs = 0;
114
    private Envelope envelope;
115
    private boolean need_calculate_envelope = false;
116
    private SimpleTaskStatus taskStatus;
117
    private String sheetName = "";
118

  
119
    public JExcelStoreProvider(JExcelStoreParameters parameters,
120
            DataStoreProviderServices storeServices) throws InitializeException {
121
        super(
122
                parameters,
123
                storeServices,
124
                FileHelper.newMetadataContainer(METADATA_DEFINITION_NAME)
125
        );
126

  
127
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
128
        this.taskStatus = manager.createDefaultSimpleTaskStatus("JExcel");
129

  
130
        counterNewsOIDs = 0;
131

  
132
        File file = getJExcelParameters().getFile();
133
        resource = this.createResource(
134
                FileResource.NAME,
135
                new Object[]{file.getAbsolutePath()}
136
        );
137

  
138
        resource.addConsumer(this);
139
        initializeFeatureTypes();
140
    }
141

  
142
    private JExcelStoreParameters getJExcelParameters() {
143
        return (JExcelStoreParameters) this.getParameters();
144
    }
145

  
146
    public String getProviderName() {
147
        return NAME;
148
    }
149

  
150
    public boolean allowWrite() {
151
        return false;
152
    }
153

  
154
    private String getFullFileName() {
155
        // Usar solo para mostrar mensajes en el logger.
156
        String s = "(unknow)";
157
        try {
158
            s = getJExcelParameters().getFile().getAbsolutePath();
159
        } catch (Exception e2) {
160
            s = "(unknow)";
161
        }
162
        return s;
163
    }
164

  
165
    @Override
166
    public void open() throws OpenException {
167
        if ( this.data != null ) {
168
            return;
169
        }
170
        this.data = new ArrayList<>();
171
        resource.setData(new HashMap());
172
        counterNewsOIDs = 0;
173
        try {
174
            loadFeatures();
175
        } catch (RuntimeException e) {
176
            logger.warn("Can't load features from JExcel '" + getFullFileName() + "'.", e);
177
            throw e;
178
        } catch (Exception e) {
179
            logger.warn("Can't load features from JExcel '" + getFullFileName() + "'.", e);
180
            throw new RuntimeException(e);
181
        }
182
    }
183

  
184
    public DataServerExplorer getExplorer() throws ReadException {
185
        DataManager manager = DALLocator.getDataManager();
186
        FilesystemServerExplorerParameters params;
187
        try {
188
            params = (FilesystemServerExplorerParameters) manager
189
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
190
            params.setRoot(this.getJExcelParameters().getFile().getParent());
191
            return manager.openServerExplorer(FilesystemServerExplorer.NAME, params);
192
        } catch (DataException e) {
193
            throw new ReadException(this.getProviderName(), e);
194
        } catch (ValidateDataParametersException e) {
195
            throw new ReadException(this.getProviderName(), e);
196
        }
197

  
198
    }
199

  
200
    public void performChanges(Iterator deleteds, Iterator inserteds, Iterator updateds, Iterator originalFeatureTypesUpdated) throws PerformEditingException {
201
        throw new UnsupportedOperationException();
202
    }
203

  
204
    public boolean closeResourceRequested(ResourceProvider resource) {
205
        return true;
206
    }
207

  
208
    public int getOIDType() {
209
        return DataTypes.LONG;
210
    }
211

  
212
    public boolean supportsAppendMode() {
213
        return false;
214
    }
215

  
216
    public void append(FeatureProvider featureProvider) {
217
        throw new UnsupportedOperationException();
218
    }
219

  
220
    public void beginAppend() {
221
        throw new UnsupportedOperationException();
222
    }
223

  
224
    public void endAppend() {
225
        throw new UnsupportedOperationException();
226
    }
227

  
228
    public void saveToState(PersistentState state) throws PersistenceException {
229
        throw new NotYetImplemented();
230
    }
231

  
232
    public void loadFromState(PersistentState state) throws PersistenceException {
233
        throw new NotYetImplemented();
234
    }
235

  
236
    public Object createNewOID() {
237
        return new Long(counterNewsOIDs++);
238
    }
239

  
240
    protected void initializeFeatureTypes() throws InitializeException {
241
        try {
242
            this.open();
243
        } catch (OpenException e) {
244
            throw new InitializeException(this.getProviderName(), e);
245
        }
246
    }
247

  
248
    public Envelope getEnvelope() throws DataException {
249
        this.open();
250
        if ( this.envelope != null ) {
251
            return this.envelope;
252
        }
253
        if ( !this.need_calculate_envelope ) {
254
            return null;
255
        }
256
        FeatureStore fs = this.getFeatureStore();
257
        FeatureType ft = fs.getDefaultFeatureType();
258
        FeatureAttributeDescriptor fad = ft.getAttributeDescriptor(ft.getDefaultGeometryAttributeIndex());
259

  
260
        try {
261
            this.envelope = GeometryLocator.getGeometryManager().createEnvelope(fad.getGeomType().getSubType());
262
            fs.accept(new Visitor() {
263
                public void visit(Object obj) throws VisitCanceledException, BaseException {
264
                    Feature f = (Feature) obj;
265
                    Geometry geom = f.getDefaultGeometry();
266
                    if ( geom != null ) {
267
                        envelope.add(geom.getEnvelope());
268
                    }
269
                }
270
            });
271
        } catch (BaseException e) {
272
            logger.warn("Can't calculate the envelope of JExcel file '" + this.getFullName() + "'.", e);
273
            this.envelope = null;
274
        }
275

  
276
        this.need_calculate_envelope = false;
277
        return this.envelope;
278
    }
279

  
280
    public Object getDynValue(String name) throws DynFieldNotFoundException {
281
        if ( DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name) ) {
282
            try {
283
                return this.getEnvelope();
284
            } catch (DataException e) {
285
                return null;
286
            }
287
        } else {
288
            if ( DataStore.METADATA_CRS.equalsIgnoreCase(name) ) {
289
                IProjection pro = JExcelStoreParameters.getCRS(this.getJExcelParameters());
290
                if ( pro != null ) {
291
                    return pro;
292
                }
293
            }
294
        }
295
        return super.getDynValue(name);
296
    }
297

  
298
    public void resourceChanged(ResourceProvider resource) {
299
        this.getStoreServices().notifyChange(
300
                DataStoreNotification.RESOURCE_CHANGED,
301
                resource);
302
    }
303

  
304
    public Object getSourceId() {
305
        return this.getJExcelParameters().getFile();
306
    }
307

  
308
    public String getName() {
309
        String name = this.getJExcelParameters().getFile().getName();
310
        if( StringUtils.isBlank(this.sheetName) ) {
311
            return FilenameUtils.getBaseName(name);
312
        }
313
        return FilenameUtils.getBaseName(name)+"."+this.sheetName;
314
    }
315

  
316
    public String getFullName() {
317
        return this.getJExcelParameters().getFile().getAbsolutePath();
318
    }
319

  
320
    public ResourceProvider getResource() {
321
        return resource;
322
    }
323

  
324
    private class FieldTypeParser {
325

  
326
        public String name = null;
327
        public int type = DataTypes.STRING;
328
        public int size = 0;
329
        public boolean allowNulls = true;
330

  
331
        private String typename = "string";
332

  
333
        FieldTypeParser() {
334
        }
335

  
336
        private int getType(String value) {
337
            DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
338
            return dataTypesManager.getType(typename);
339
        }
340

  
341
        // El formato seria:
342
        //   name[:typename[:size[:notnull|null]]]
343
        //   name[__typename[__size[__notnull|null]]]
344
        //
345
        public boolean parse(String value) {
346
            String typename = null;
347
            String[] ss = null;
348
            if ( value.contains(":") ) {
349
                ss = value.split(":");
350
            } else if ( value.contains("__") ) {
351
                ss = value.split("__");
352
            }
353
            if ( ss == null ) {
354
                this.name = value;
355
                return true;
356
            }
357
            switch (ss.length) {
358
            case 4:
359
                if ( ss[3].length() > 0 ) {
360
                    if ( "notnull".equalsIgnoreCase(ss[3]) ) {
361
                        this.allowNulls = false;
362
                    } else {
363
                        this.allowNulls = true;
364
                    }
365
                }
366
            case 3:
367
                if ( ss[2].length() > 0 ) {
368
                    try {
369
                        this.size = Integer.parseInt(ss[2]);
370
                    } catch (Exception ex) {
371
                        logger.warn("Ignore incorrect field size for field " + value + " in JExcel header of '" + getFullFileName() + "'.", ex);
372
                    }
373
                }
374
            case 2:
375
                if ( ss[1].length() > 0 ) {
376
                    this.typename = ss[1];
377
                    this.type = this.getType(this.typename);
378
                    if ( this.type == DataTypes.INVALID ) {
379
                        this.type = DataTypes.STRING;
380
                        logger.info("Type '" + typename + "' not valid for attribute '" + value + "' in JExcel file '" + getFullFileName() + "'.");
381
                    }
382
                }
383
            case 1:
384
                this.name = ss[0];
385
                break;
386
            }
387

  
388
            if ( this.type != DataTypes.STRING ) {
389
                this.size = 0;
390
            }
391
            return true;
392
        }
393

  
394
    }
395

  
396
    private EditableFeatureType getFeatureType(String headers[], int automaticTypes[]) {
397
        EditableFeatureType fType = getStoreServices().createFeatureType(this.getName());
398
        fType.setHasOID(true);
399
        DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
400

  
401
        FieldTypeParser[] fieldTypes = new FieldTypeParser[headers.length];
402
        //
403
        // Calculamos cuales pueden ser los tipos de datos
404
        //
405
        for ( int i = 0; i < fieldTypes.length; i++ ) {
406
            fieldTypes[i] = new FieldTypeParser();
407
        }
408

  
409
        // Asuminos los tipos pasados por parametro, que se supone
410
        // son los detectados automaticamente.
411
        if ( automaticTypes != null ) {
412
            for ( int i = 0; i < fieldTypes.length && i < automaticTypes.length; i++ ) {
413
                fieldTypes[i].type = automaticTypes[i];
414
            }
415
        }
416
        // Luego probamos con lo que diga las cabezeras del CVS, sobreescribiendo
417
        // los tipos anteriores en caso de definirse en la cabezara.
418
        for ( int i = 0; i < fieldTypes.length; i++ ) {
419
            if ( !fieldTypes[i].parse(headers[i]) ) {
420
                continue;
421
            }
422

  
423
        }
424

  
425
        // Y por ultimo hacemos caso a lo que se haya especificado en los parametros
426
        // de apertura del JExcel, teniendo esto prioridad sobre todo.
427
        int[] param_types = JExcelStoreParameters.getFieldTypes(this.getParameters());
428
        if ( param_types != null ) {
429
            for ( int i = 0; i < fieldTypes.length && i < param_types.length; i++ ) {
430
                fieldTypes[i].type = param_types[i];
431
            }
432
        }
433

  
434
        int[] param_sizes = JExcelStoreParameters.getFieldSizes(this.getParameters());
435
        if ( param_sizes != null ) {
436
            for ( int i = 0; i < param_sizes.length; i++ ) {
437
                if ( param_sizes[i] > 0 ) {
438
                    fieldTypes[i].size = param_sizes[i];
439
                }
440
            }
441
        }
442
        //
443
        // Una vez ya sabemos los tipos de datos rellenamos el feature-type
444
        //
445
        for ( int i = 0; i < fieldTypes.length; i++ ) {
446
            EditableFeatureAttributeDescriptor fad = fType.add(
447
                    fieldTypes[i].name,
448
                    fieldTypes[i].type
449
            );
450
            fad.setSize(fieldTypes[i].size);
451
            fad.setAllowNull(fieldTypes[i].allowNulls);
452
            if ( fieldTypes[i].type == DataTypes.GEOMETRY
453
                    && fType.getDefaultGeometryAttributeName() == null ) {
454
                fType.setDefaultGeometryAttributeName(fieldTypes[i].name);
455
            }
456
        }
457
        String[] pointDimensionNames = JExcelStoreParameters.getPointDimensionNames(this.getParameters());
458
        if ( pointDimensionNames != null ) {
459
//            ToPointEvaluaror evaluator = new ToPointEvaluaror(pointDimensionNames);
460
            PointAttributeEmulator emulator = new PointAttributeEmulator(pointDimensionNames);
461
            EditableFeatureAttributeDescriptor attr = fType.add("GEOM", DataTypes.GEOMETRY, emulator);
462
            GeometryManager geommgr = GeometryLocator.getGeometryManager();
463
            GeometryType gt;
464
            try {
465
                if ( emulator.fieldNames != null && emulator.fieldNames.length <= 2 ) {
466
                	gt = geommgr.getGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM2D);
467
                } else {
468
                	gt = geommgr.getGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM3D);
469
                }
470
                attr.setGeometryType(gt);
471
            } catch (Exception e) {
472
                logger.warn("Can't set geometry type for the calculated field in JExcel file '" + getFullFileName() + "'.", e);
473
            }
474
        }
475
        return fType;
476
    }
477

  
478
    static class PointAttributeEmulator implements FeatureAttributeEmulator {
479

  
480
        private static final Logger LOGGER = LoggerFactory.getLogger(PointAttributeEmulator.class);
481

  
482
        private static final int XNAME = 0;
483
        private static final int YNAME = 1;
484
        private static final int ZNAME = 2;
485

  
486
        private final GeometryManager geommgr;
487
        private final Coercion toDouble;
488
        private final DataType dataType;
489
        private FilteredLogger logger;
490

  
491
        private String[] fieldNames;
492

  
493
        public PointAttributeEmulator() {
494
            this.geommgr = GeometryLocator.getGeometryManager();
495
            DataTypesManager datatypeManager = ToolsLocator.getDataTypesManager();
496

  
497
            this.toDouble = datatypeManager.getCoercion(DataTypes.DOUBLE);
498
            this.dataType = datatypeManager.get(DataTypes.GEOMETRY);
499
        }
500
        
501
        public PointAttributeEmulator(String[] pointDimensionNames) {
502
            this();
503
            if ( pointDimensionNames.length > 2 ) {
504
                this.fieldNames = new String[3];
505
                this.fieldNames[ZNAME] = pointDimensionNames[2];
506
            } else {
507
                this.fieldNames = new String[2];
508
            }
509
            this.fieldNames[XNAME] = pointDimensionNames[0];
510
            this.fieldNames[YNAME] = pointDimensionNames[1];
511
        }
512
        
513
        private FilteredLogger getLogger() {
514
            if( this.logger == null ) {
515
                this.logger = new FilteredLogger(LOGGER, "JExcelPointAttributeEmulator", 10);
516
                this.logger.setInterval(60000);
517
            }
518
            return this.logger;
519
        }
520

  
521
        @Override
522
        public Object get(Feature feature) {
523
            try {
524
                Object valueX = feature.get(this.fieldNames[XNAME]);
525
                valueX = toDouble.coerce(valueX);
526
                if ( valueX == null ) {
527
                    return null;
528
                }
529
                Object valueY = feature.get(this.fieldNames[YNAME]);
530
                valueY = toDouble.coerce(valueY);
531
                if ( valueY == null ) {
532
                    return null;
533
                }
534
                Object valueZ = null;
535
                if ( this.fieldNames.length > 2 ) {
536
                    valueZ = toDouble.coerce(feature.get(this.fieldNames[ZNAME]));
537
                    if ( valueZ == null ) {
538
                        return null;
539
                    }
540
                }
541

  
542
                double x = ((Double) valueX);
543
                double y = ((Double) valueY);
544
                Point point;
545
                if ( this.fieldNames.length > 2 ) {
546
                    point = geommgr.createPoint(x, y, Geometry.SUBTYPES.GEOM3D);
547
                    double z = ((Double) valueZ);
548
                    point.setCoordinateAt(2, z);
549
                } else {
550
                    point = geommgr.createPoint(x, y, Geometry.SUBTYPES.GEOM2D);
551
                }
552
                return point;
553
            } catch (Exception ex) {
554
                this.getLogger().warn("Can't create point in JExcel provider. XNAME='"
555
                        + this.fieldNames[XNAME] + "', YNAME='" + this.fieldNames[YNAME] + "' feature=" + feature.toString(), ex);
556
                return null;
557
            }
558
        }
559

  
560
        @Override
561
        public void set(EditableFeature feature, Object value) {
562
            if ( value == null ) {
563
                return;
564
            }
565
            Point point;
566
            if ( value instanceof MultiPoint ) {
567
                point = (Point) ((MultiPoint) value).getPrimitiveAt(0);
568
            } else {
569
                point = (Point) value;
570
            }
571
            feature.set(this.fieldNames[XNAME], point.getX());
572
            feature.set(this.fieldNames[YNAME], point.getY());
573
            if ( this.fieldNames.length > 2 ) {
574
                feature.set(this.fieldNames[ZNAME], point.getCoordinateAt(2));
575
            }
576
        }
577

  
578
        @Override
579
        public boolean allowSetting() {
580
            return true;
581
        }
582

  
583
        @Override
584
        public String[] getRequiredFieldNames() {
585
            return this.fieldNames;
586
        }
587

  
588
        @Override
589
        public void fromJson(JsonObject json) {
590
            this.fieldNames = (String[]) Json.toArray(json, "fieldNames", new String[0]);
591
        }
592

  
593
        @Override
594
        public JsonObject toJson() {
595
            return this.toJsonBuilder().build();
596
        }
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff