Statistics
| Revision:

root / tags / v2_0_0_Build_2049 / libraries / libFMap_mapcontext / src / org / gvsig / fmap / mapcontext / rendering / symbols / impl / DefaultSymbolManager.java @ 38488

History | View | Annotate | Download (9.81 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2009 {DiSiD Technologies}  {{Task}}
26
 */
27
package org.gvsig.fmap.mapcontext.rendering.symbols.impl;
28

    
29
import java.awt.Color;
30
import java.io.File;
31
import java.io.FileFilter;
32
import java.io.FileInputStream;
33
import java.io.FileOutputStream;
34
import java.io.IOException;
35
import java.util.Collections;
36
import java.util.HashMap;
37
import java.util.Map;
38
import java.util.Random;
39

    
40
import org.gvsig.fmap.mapcontext.MapContextRuntimeException;
41
import org.gvsig.fmap.mapcontext.impl.InvalidRegisteredClassException;
42
import org.gvsig.fmap.mapcontext.impl.RegisteredClassInstantiationException;
43
import org.gvsig.fmap.mapcontext.rendering.symbols.IMultiLayerSymbol;
44
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
45
import org.gvsig.fmap.mapcontext.rendering.symbols.IWarningSymbol;
46
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolException;
47
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolManager;
48
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolPreferences;
49
import org.gvsig.tools.ToolsLocator;
50
import org.gvsig.tools.persistence.PersistenceManager;
51
import org.gvsig.tools.persistence.PersistentState;
52
import org.gvsig.tools.persistence.exception.PersistenceException;
53

    
54
/**
55
 * Default {@link SymbolManager} implementation.
56
 * 
57
 * @author gvSIG team
58
 */
59
public class DefaultSymbolManager implements SymbolManager {
60

    
61
        private SymbolPreferences symbolPreferences =
62
                        new DefaultSymbolPreferences();
63

    
64
        private Map symbolsByName = Collections.synchronizedMap(new HashMap());
65

    
66
        private Map symbolsByShapeType = Collections.synchronizedMap(new HashMap());
67

    
68
        private Map multiLineSymbolsByName =
69
                        Collections.synchronizedMap(new HashMap());
70

    
71
        private Map multiLineSymbolsByShapeType =
72
                        Collections.synchronizedMap(new HashMap());
73

    
74
        private IWarningSymbol warningSymbol;
75

    
76
        private Object warningSymbolLock = new Object();
77

    
78
        public ISymbol[] loadSymbols(File folder) throws SymbolException {
79
                return loadSymbols(folder, null);
80
        }
81

    
82
        public ISymbol[] loadSymbols(File folder, FileFilter fileFilter)
83
                        throws SymbolException {
84
                // TODO: add symbol caching
85

    
86
                if (folder.exists()) {
87

    
88
                        File[] symbolFiles = null;
89
                        if (fileFilter == null) {
90
                                symbolFiles = folder.listFiles();
91
                        } else {
92
                                symbolFiles = folder.listFiles(fileFilter);
93
                        }
94

    
95
                        if (symbolFiles != null) {
96
                                ISymbol[] symbols = new ISymbol[symbolFiles.length];
97
                                for (int i = 0; i < symbolFiles.length; i++) {
98
                                        symbols[i] = loadSymbol(symbolFiles[i]);
99
                                }
100
                                return symbols;
101
                        }
102
                }
103

    
104
                return null;
105
        }
106

    
107
        public void saveSymbol(ISymbol symbol, String fileName, File folder)
108
                        throws SymbolException {
109
                saveSymbol(symbol, fileName, folder, false);
110
        }
111

    
112
        public void saveSymbol(ISymbol symbol, String fileName, File folder,
113
                        boolean overwrite) throws SymbolException {
114
                // TODO: add symbol caching
115

    
116
                PersistenceManager persistenceManager = ToolsLocator
117
                                .getPersistenceManager();
118

    
119
                File symbolFile = new File(folder, fileName);
120
                if (!overwrite && symbolFile.exists()) {
121
                        throw new SymbolFileAlreadyExistsException(symbolFile);
122
                }
123

    
124
                try {
125
                        FileOutputStream fos = new FileOutputStream(symbolFile);
126

    
127
                        persistenceManager.saveState(persistenceManager.getState(symbol),
128
                                        fos);
129

    
130
                        fos.flush();
131
                        fos.close();
132
                } catch (PersistenceException e) {
133
                        throw new SaveSymbolException(e);
134
                } catch (IOException e) {
135
                        throw new SaveSymbolException(e);
136
                }
137
        }
138

    
139
        /**
140
         * Loads a persisted symbol from the given file.
141
         */
142
        private ISymbol loadSymbol(File file) throws SymbolException {
143
                if (file.exists()) {
144
                        try {
145
                                FileInputStream fis = new FileInputStream(file);
146

    
147
                                PersistenceManager persistenceManager = ToolsLocator
148
                                                .getPersistenceManager();
149

    
150
                                PersistentState state = persistenceManager.loadState(fis);
151
                                ISymbol symbol = (ISymbol) persistenceManager.create(state);
152

    
153
                                fis.close();
154
                                return symbol;
155
                        } catch (PersistenceException e) {
156
                                throw new LoadSymbolException(e);
157
                        } catch (IOException e) {
158
                                throw new LoadSymbolException(e);
159
                        }
160
                }
161

    
162
                return null;
163
        }
164

    
165
        public SymbolPreferences getSymbolPreferences() {
166
                return symbolPreferences;
167
        }
168

    
169
        public ISymbol createSymbol(String symbolName)
170
                        throws MapContextRuntimeException {
171
                return createSymbol(symbolName, (Class) symbolsByName.get(symbolName),
172
                                ISymbol.class);
173
        }
174

    
175
        public ISymbol createSymbol(int shapeType)
176
                        throws MapContextRuntimeException {
177
                String symbolName =
178
                                (String) symbolsByShapeType.get(new Integer(shapeType));
179

    
180
                return symbolName == null ? null : createSymbol(symbolName);
181
        }
182

    
183
        public ISymbol createSymbol(String symbolName, Color color)
184
                        throws MapContextRuntimeException {
185
                ISymbol symbol = createSymbol(symbolName);
186

    
187
                if (symbol != null) {
188
                        symbol.setColor(color);
189
                }
190

    
191
                return symbol;
192
        }
193

    
194
        public ISymbol createSymbol(int shapeType, Color color)
195
                        throws MapContextRuntimeException {
196
                String symbolName =
197
                                (String) symbolsByShapeType.get(new Integer(shapeType));
198

    
199
                return symbolName == null ? null : createSymbol(symbolName, color);
200
        }
201

    
202
        public IMultiLayerSymbol createMultiLayerSymbol(String symbolName)
203
                        throws MapContextRuntimeException {
204
                return (IMultiLayerSymbol) createSymbol(symbolName,
205
                                (Class) multiLineSymbolsByName.get(symbolName),
206
                                IMultiLayerSymbol.class);
207
        }
208

    
209
        public IMultiLayerSymbol createMultiLayerSymbol(int shapeType)
210
                        throws MapContextRuntimeException {
211
                String symbolName =
212
                                (String) multiLineSymbolsByShapeType.get(new Integer(shapeType));
213

    
214
                return symbolName == null ? null : createMultiLayerSymbol(symbolName);
215
        }
216

    
217
        public void registerSymbol(String symbolName, Class symbolClass)
218
                        throws MapContextRuntimeException {
219
                if (symbolClass == null || !ISymbol.class.isAssignableFrom(symbolClass)) {
220
                        throw new InvalidRegisteredClassException(ISymbol.class,
221
                                        symbolClass, symbolName);
222
                }
223
                symbolsByName.put(symbolName, symbolClass);
224
        }
225

    
226
        public void registerSymbol(String symbolName, int[] shapeTypes,
227
                        Class symbolClass) throws MapContextRuntimeException {
228
                registerSymbol(symbolName, symbolClass);
229
                if (shapeTypes != null) {
230
                        for (int i = 0; i < shapeTypes.length; i++) {
231
                                symbolsByShapeType.put(new Integer(shapeTypes[i]), symbolName);
232
                        }
233
                }
234
        }
235

    
236
        public void registerMultiLayerSymbol(String symbolName, Class symbolClass)
237
                        throws MapContextRuntimeException {
238
                if (symbolClass == null
239
                                || !IMultiLayerSymbol.class.isAssignableFrom(symbolClass)) {
240
                        throw new InvalidRegisteredClassException(IMultiLayerSymbol.class,
241
                                        symbolClass, symbolName);
242
                }
243

    
244
                multiLineSymbolsByName.put(symbolName, symbolClass);
245
        }
246

    
247
        public void registerMultiLayerSymbol(String symbolName, int[] shapeTypes,
248
                        Class symbolClass) throws MapContextRuntimeException {
249
                registerMultiLayerSymbol(symbolName, symbolClass);
250
                if (shapeTypes != null) {
251
                        for (int i = 0; i < shapeTypes.length; i++) {
252
                                multiLineSymbolsByShapeType.put(new Integer(shapeTypes[i]),
253
                                                symbolName);
254
                        }
255
                }
256
        }
257

    
258
        public IWarningSymbol getWarningSymbol(String message, String symbolDesc,
259
                        int symbolDrawExceptionType) throws MapContextRuntimeException {
260
                synchronized (warningSymbolLock) {
261
                        if (warningSymbol == null) {
262
                                warningSymbol = (IWarningSymbol) createSymbol("warning");
263
                        }
264
                }
265

    
266
                // TODO: set those values as parameter values in the draw method.
267
                warningSymbol.setDescription(symbolDesc);
268
                warningSymbol.setMessage(message);
269
                warningSymbol.setDrawExceptionType(symbolDrawExceptionType);
270

    
271
                return warningSymbol;
272
        }
273

    
274
        private ISymbol createSymbol(String symbolName, Class symbolClass,
275
                        Class expectedType) throws MapContextRuntimeException {
276
                ISymbol symbol;
277
                try {
278
                        symbol =
279
                                        (ISymbol) (symbolClass == null ? null
280
                                                        : symbolClass.newInstance());
281
                } catch (InstantiationException e) {
282
                        throw new RegisteredClassInstantiationException(expectedType,
283
                                        symbolClass, symbolName, e);
284
                } catch (IllegalAccessException e) {
285
                        throw new RegisteredClassInstantiationException(expectedType,
286
                                        symbolClass, symbolName, e);
287
                }
288

    
289
        Color symbolColor;
290
        if (getSymbolPreferences().isDefaultSymbolFillColorAleatory()) {
291
            Random rand = new Random();
292
            int numreg = rand.nextInt(255 / 2);
293
            double div = (1 - rand.nextDouble() * 0.66) * 0.9;
294
            symbolColor =
295
                new Color(
296
                    ((int) (255 * div + (numreg * rand.nextDouble()))) % 255,
297
                    ((int) (255 * div + (numreg * rand.nextDouble()))) % 255,
298
                    ((int) (255 * div + (numreg * rand.nextDouble()))) % 255);
299
        }
300
        else {
301
            symbolColor = getSymbolPreferences().getDefaultSymbolFillColor();
302
        }
303
        symbol.setColor(symbolColor);
304
                // Perform this initialization into the Symbol implementation
305
                // if (symbol instanceof CartographicSupport) {
306
                // CartographicSupport cs = (CartographicSupport) symbol;
307
                // cs.setUnit(getDefaultCartographicSupportMeasureUnit());
308
                // cs
309
                // .setReferenceSystem(getDefaultCartographicSupportReferenceSystem();
310
                // }
311

    
312
                return symbol;
313
        }
314
        
315
        public void setSymbolPreferences(SymbolPreferences symbolPreferences) {
316
                this.symbolPreferences = symbolPreferences;
317
        }
318
}