Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.lib / org.gvsig.exportto.lib.impl / src / main / java / org / gvsig / export / impl / service / DefaultAttributeNamesTranslator.java @ 43925

History | View | Annotate | Download (2.7 KB)

1

    
2
package org.gvsig.export.impl.service;
3

    
4
import java.util.Collection;
5
import java.util.HashMap;
6
import java.util.Map;
7
import org.gvsig.export.spi.AttributeNamesTranslator;
8
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
9
import org.gvsig.fmap.dal.feature.FeatureType;
10

    
11

    
12
public class DefaultAttributeNamesTranslator implements AttributeNamesTranslator {
13
    
14
    private final Map<String,String> sourceToTarget;
15
    private final Map<String,String> targetToSource;
16
    private final int maxNameLen;
17
    
18
    public DefaultAttributeNamesTranslator(FeatureType type, int maxNameLen) {
19
        this.maxNameLen = maxNameLen;
20
        this.sourceToTarget = new HashMap<>();
21
        this.targetToSource = new HashMap<>();
22
        for( FeatureAttributeDescriptor attr : type) {
23
            String source_name = attr.getName();
24
                          String target_name = buildTranslatedName(source_name, this.sourceToTarget.values());
25
            if( !source_name.equals(target_name) ) {
26
                this.sourceToTarget.put(source_name, target_name);
27
                this.targetToSource.put(target_name, source_name);
28
            }
29
        }
30
    }
31
    
32
    @Override
33
    public String getTargetName(String name) {
34
         return this.sourceToTarget.getOrDefault(name, name);
35
    }
36

    
37
    @Override
38
    public String getSourceName(String name) {
39
         return this.targetToSource.getOrDefault(name, name);
40
    }
41
    
42
    @Override
43
    public boolean hasTranslations() {
44
        return !this.sourceToTarget.isEmpty();
45
    }
46
    
47
    @Override
48
    public boolean hasTranslation(String name) {
49
        return this.sourceToTarget.get(name)!=null;
50
    }
51
    
52
        private String buildTranslatedName(String source_name, Collection<String> current_names) {
53

    
54
                int len = source_name.length();
55
                if (len <= this.maxNameLen) {
56
                        /*
57
                         * Should not happen
58
                         */
59
                        return source_name;
60
                }
61
                String target_name;
62
                /*
63
                 * GDAL field name truncation method (extended from 100 to 255)
64
                 * THISISAVERYLONGNAME => THISISAVER, THISISAV_1 ... THISISAV_9,
65
                 * THISISAV10 ... THISISAV99, THISISA100 ... THISISA255
66
                 * (255 = max number of fields in a SHP)
67
                 */
68
                for (int i=0; i<255; i++) {
69
                    if (i==0) {
70
                target_name = source_name.substring(0, 10);
71
            } else if (i<=9) {
72
                target_name = source_name.substring(0, 8) + "_" + i;
73
            } else if (i<=99) {
74
                target_name = source_name.substring(0, 8) + i;
75
            } else {
76
                target_name = source_name.substring(0, 7) + i;
77
            }
78
                    if (!current_names.contains(target_name)) {
79
                return target_name;
80
            }
81
                }
82
                /*
83
                 * Should not get here
84
                 */
85
                return source_name.substring(0, 4) + "_" + (System.currentTimeMillis() % 1000000);
86
        }    
87
}