Statistics
| Revision:

svn-gvsig-desktop / branches / v02_desarrollo / libraries / sld / org.gvsig.sldsupport / org.gvsig.sldsupport.lib / org.gvsig.sldsupport.lib.impl / src / main / java / org / gvsig / sldsupport / impl / DefaultSLDSupportManager.java @ 40754

History | View | Annotate | Download (5.1 KB)

1
package org.gvsig.sldsupport.impl;
2

    
3
import java.io.File;
4
import java.io.OutputStream;
5
import java.util.Collection;
6
import java.util.HashMap;
7
import java.util.HashSet;
8
import java.util.Iterator;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.Set;
12

    
13
import org.gvsig.fmap.mapcontext.layers.vectorial.VectorLayer;
14
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
15
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
16
import org.gvsig.sldsupport.SLDSupportManager;
17
import org.gvsig.sldsupport.exception.SLDReadException;
18
import org.gvsig.sldsupport.exception.SLDWriteException;
19
import org.gvsig.sldsupport.io.SLDLegendReader;
20
import org.gvsig.sldsupport.io.SLDLegendWriter;
21
import org.slf4j.Logger;
22
import org.slf4j.LoggerFactory;
23
import org.xmlpull.v1.XmlPullParser;
24

    
25
public class DefaultSLDSupportManager implements SLDSupportManager {
26
        
27
        private static Logger logger = LoggerFactory.getLogger(DefaultSLDSupportManager.class);
28
        
29
        private Map<Class<? extends ILegend>, Set<SLDLegendReader>> legToReaders =
30
        new HashMap<Class<? extends ILegend>, Set<SLDLegendReader>>();
31
        // ================
32
        private Map<Class<? extends ILegend>, Set<SLDLegendWriter>> legToWriters =
33
        new HashMap<Class<? extends ILegend>, Set<SLDLegendWriter>>();
34
        
35
        public DefaultSLDSupportManager() {
36
                
37
        }
38

    
39
        public ILegend readLegend(File f, VectorLayer vlayer)
40
                        throws SLDReadException {
41
                
42
                ILegend resp = null;
43
                Collection<Set<SLDLegendReader>> all_readers = legToReaders.values();
44
                
45
                Iterator<Set<SLDLegendReader>> iter_a = all_readers.iterator();
46
                Set<SLDLegendReader> item_a = null;
47
                Iterator<SLDLegendReader> iter_b = null;
48
                SLDLegendReader item_b = null;
49
                while (iter_a.hasNext()) {
50
                        item_a = iter_a.next();
51
                        iter_b = item_a.iterator();
52
                        while (iter_b.hasNext()) {
53
                                item_b = iter_b.next();
54
                                try {
55
                                        resp = item_b.readLegend(f, vlayer);
56
                                } catch (SLDReadException exc) {
57
                                        logger.info("While reading SLD file.", exc);
58
                                        // This reader did not work
59
                                } catch (Exception exc) {
60
                                        logger.info("While reading SLD file.", exc);
61
                                }
62
                                if (resp != null) {
63
                                        return resp;
64
                                }
65
                        }
66
                }
67
                throw new SLDReadException(new Exception(
68
                                "Unable to read legend from file: " + f.getAbsolutePath()));
69
        }
70
        
71

    
72
        public void writeLegend(
73
                        ILegend leg,
74
                        String layer_name,
75
                        OutputStream out,
76
                        String version)
77
                        throws SLDWriteException {
78
                
79
                if (leg == null) {
80
                        throw new SLDWriteException(new Exception("Legend is NULL"));
81
                }
82
                Set<SLDLegendWriter> set = getLegendWritersFor(leg);
83

    
84
                if (set == null || set.size() == 0) {
85
                        throw new SLDWriteException(new Exception(
86
                                        "Unsupported legend: '" + leg.getClass().getName() + "'"));
87
                }
88

    
89
                Iterator<SLDLegendWriter> iter = set.iterator();
90
                List<String> vv = null;
91
                SLDLegendWriter item = null;
92
                while (iter.hasNext()) {
93
                        item = iter.next();
94
                        vv = item.getSupportedVersions();
95
                        if (vv.contains(version)) {
96
                                item.writeLegend(leg, layer_name, out, version);
97
                                return;
98
                        }
99
                }
100
                throw new SLDWriteException(new Exception(
101
                                "Legend is supported: '" + leg.getClass().getName()
102
                                                + "' but not in version '" + version + "'"));
103
        }
104
        
105
        // =========================================
106
        // =========================================
107

    
108
        public void registerLegendReader(SLDLegendReader reader) {
109
                
110
                List<Class<? extends ILegend>> list = reader.getSupportedLegends();
111
                if (list == null || list.size() == 0) {
112
                        return;
113
                }
114
                Iterator<Class<? extends ILegend>> iter = list.iterator();
115
                
116
                Class<? extends ILegend> clazz = null;
117
                Set<SLDLegendReader> set = null;
118
                while (iter.hasNext()) {
119
                        clazz = iter.next();
120
                        set = this.legToReaders.get(clazz);
121
                        if (set == null) {
122
                                set = new HashSet<SLDLegendReader>();
123
                                set.add(reader);
124
                                this.legToReaders.put(clazz, set);
125
                        } else {
126
                                set.add(reader);
127
                        }
128
                }
129
        }
130

    
131
        public void registerLegendWriter(SLDLegendWriter writer) {
132

    
133
                List<Class<? extends ILegend>> list = writer.getSupportedLegends();
134
                if (list == null || list.size() == 0) {
135
                        return;
136
                }
137
                Iterator<Class<? extends ILegend>> iter = list.iterator();
138
                
139
                Class<? extends ILegend> clazz = null;
140
                Set<SLDLegendWriter> set = null;
141
                while (iter.hasNext()) {
142
                        clazz = iter.next();
143
                        set = this.legToWriters.get(clazz);
144
                        if (set == null) {
145
                                set = new HashSet<SLDLegendWriter>();
146
                                set.add(writer);
147
                                this.legToWriters.put(clazz, set);
148
                        } else {
149
                                set.add(writer);
150
                        }
151
                }
152
        }
153

    
154
        
155
        // =============================
156
        
157
        private Set<SLDLegendWriter> getLegendWritersFor(ILegend leg) {
158
                
159
                Set<SLDLegendWriter> resp = new HashSet<SLDLegendWriter>();
160
                if (leg == null) {
161
                        return resp;
162
                }
163
                Class<? extends ILegend> target = leg.getClass();
164
                Class<? extends ILegend> kitem = null;
165
                Iterator<Class<? extends ILegend>> kiter = legToWriters.keySet().iterator();
166
                while (kiter.hasNext()) {
167
                        kitem = kiter.next();
168
                        if (kitem.isAssignableFrom(target)) {
169
                                /*
170
                                 * kitem is same or superclass/superinterface of target
171
                                 */
172
                                resp.addAll(legToWriters.get(kitem));
173
                        }
174
                }
175
                return resp;
176
        }
177

    
178
        
179
        
180

    
181
}