Statistics
| Revision:

root / trunk / libraries / libRaster / tmp / cache2 / MultiBandCache.java @ 10740

History | View | Annotate | Download (12.1 KB)

1 10740 nacho
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.dataaccess.cache2;
20
21
import java.io.IOException;
22
23
import org.gvsig.raster.dataaccess.cache.Cache;
24
import org.gvsig.raster.dataaccess.cache.CacheDataServer;
25
import org.gvsig.raster.driver.IBuffer;
26
27
/**
28
 * Clase que representa la cach? de datos de un raster multibanda. Esta
29
 * consta de multiples cach?s monobanda, tantas como bandas tenga el raster.
30
 * Todas las cach?s se llevan sincronizadas por ello las consultas siempre se hacen
31
 * a la cach? 0 del array ya que se supone que todas deben dar el mismo resultado.
32
 *
33
 * @author Nacho Brodin (nachobrodin@gmail.com)
34
 *
35
 */
36
public class MultiBandCache {
37
        private Cache[]                                cache = null;
38
        private int                                 nBands = 0;
39
        private int                                        dataType = IBuffer.TYPE_UNDEFINED;
40
        private int                                        width = 0;
41
        private int                                        height = 0;
42
43
        public MultiBandCache(int dataType, int width, int height, int nBands){
44
                this.nBands = nBands;
45
                this.dataType = dataType;
46
                this.width = width;
47
                this.height = height;
48
49
                cache = new Cache[nBands];
50
                for (int iBand = 0; iBand < nBands; iBand++) {
51
                        cache[iBand] = new Cache(1, dataType, width, height);
52
                        cache[iBand].setDataSource(new CacheDataServer());
53
                }
54
        }
55
56
        //****************** OPERACIONES SOBRE CACHE[0..N]********************************
57
58
        /**
59
         * Salve una p?gina especificada en el par?metro nPag a disco. La
60
         * petici?n que ha de hacerse se calcula previamente con la estructura de la cach?.
61
         *
62
         * @param nPag N?mero de p?gina a salvar
63
         * @param pageBuffer Buffer de datos a salvar.
64
         * @throws IOException
65
         */
66
        public void savePage(int nPag, MultiBandPageBuffer pageBuffer) throws IOException {
67
                for(int i = 0; i < nBands; i++)
68
                        cache[i].getDataSource().savePage(nPag, pageBuffer.getPagePerBand(i));
69
        }
70
71
        /**
72
         * Carga una p?gina especificada en el par?metro nPag con los datos necesarios. La
73
         * petici?n que ha de hacerse se calcula previamente con la estructura de la cach?.
74
         *
75
         * @param nPag N?mero de p?gina a cargar
76
         * @param pageBuffer Buffer de datos a cargar.
77
         */
78
        public void loadPage(int nPag, MultiBandPageBuffer pageBuffer) {
79
                for(int i = 0; i < nBands; i++)
80
                        cache[i].getDataSource().loadPage(nPag, pageBuffer.getPagePerBand(i));
81
        }
82
83
        /**
84
         * Obtiene la p?gina de datos a partir del n?mero de p?gina de raster
85
         * @param pag N?mero de p?gina raster a recuperar
86
         * @return PageBuffer correspondiente a la p?gina recuperada o null si no est? en cach?
87
         */
88
        public MultiBandPageBuffer getPageBufferFromNumberRasterPage(int pag) {
89
                MultiBandPageBuffer mbPageBuffer = new MultiBandPageBuffer(dataType, width, height, nBands);
90
                for(int i = 0; i < nBands; i++)
91
                        mbPageBuffer.setPage(i, cache[i].getPageBufferFromNumberRasterPage(pag));
92
                return mbPageBuffer;
93
        }
94
95
        /**
96
         * Obtiene la p?gina de datos del grupo definido en el par?metro group y de la
97
         * posici?n pag dentro de ese grupo.
98
         * @param group Grupo de la p?gina requerida
99
         * @param pag N?mero de p?gina dentro del grupo
100
         * @return PageBuffer correspondiente a la p?gina recuperada
101
         */
102
        public MultiBandPageBuffer getPageBuffer(int group, int posInGroup) {
103
                MultiBandPageBuffer mbPageBuffer = new MultiBandPageBuffer(dataType, width, height, nBands);
104
                for(int i = 0; i < nBands; i++)
105
                        mbPageBuffer.setPage(i, cache[i].getPageBuffer(group, posInGroup));
106
                return mbPageBuffer;
107
        }
108
109
        /**
110
         * Asigna el buffer de la p?gina accedida por referencia
111
         * @param pb
112
         */
113
        public void setAccessPage(MultiBandPageBuffer pb, int pagNumber){
114
                for(int i = 0; i < nBands; i++)
115
                        cache[i].setAccessPage(pb.getPagePerBand(i), pagNumber);
116
        }
117
118
        /**
119
         * Obtiene la p?gina de datos actualmente accedida
120
         * @return PageBuffer correspondiente a la p?gina que se est? accediendo
121
         */
122
        public MultiBandPageBuffer getAccessPage() {
123
                MultiBandPageBuffer mbPageBuffer = new MultiBandPageBuffer(dataType, width, height, nBands);
124
                for(int i = 0; i < nBands; i++)
125
                        mbPageBuffer.setPage(i, cache[i].getAccessPage());
126
                return mbPageBuffer;
127
        }
128
129
        /**
130
         * Actualiza los ?ltimos accesos del grupo pasado por par?metro. Se incrementar?
131
         * uno en todas las p?ginas del conjunto a excepci?n de las que valen -1 ya que
132
         * esto significa que no hay p?gina cargada en dicha posici?n.
133
         * @param group N?mero de grupo a actualizar sus accesos
134
         * @return La posici?n del elemento del grupo con valor m?ximo. Este elemento
135
         * es el candidato para el reemplazo.
136
         */
137
        public int updateLastAccess(int group){
138
                int posMax = 0;
139
                for(int i = 0; i < nBands; i++)
140
                        posMax = cache[i].updateLastAccess(group);
141
                return posMax;
142
        }
143
144
        /**
145
         * Asigna un cero en la posici?n del array que contiene la antig?edad de acceso dentro
146
         * del grupo. Esta operaci?n se realiza cada vez que se accede a un dato del la p?gina
147
         * cacheada y significa que es la p?gina m?s recientemente accedida.
148
         * @param group N?mero de grupo
149
         * @param posInGroup Posici?n de la p?gina dentro del grupo.
150
         */
151
        public void setZeroInLastAccess(int group, int posInGroup){
152
                for(int i = 0; i < nBands; i++)
153
                        cache[i].setZeroInLastAccess(group, posInGroup);
154
        }
155
156
        /**
157
         * Pone como modificada una p?gina de cach?
158
         * @param group Grupo en el que se encuentra la p?gina
159
         * @param posInGroup Posici?n dentro del grupo en el que est? la p?gina
160
         */
161
        public void setModify(int group, int posInGroup){
162
                for(int i = 0; i < nBands; i++)
163
                        cache[i].setModify(group, posInGroup);
164
        }
165
166
        /**
167
         * Marca una p?gina como cargada en cach?.
168
         * @param nPag N?mero de p?gina a marcar.
169
         */
170
        public void setPageAsLoadInCache(int nPag){
171
                for(int i = 0; i < nBands; i++)
172
                        cache[i].setPageAsLoadInCache(nPag);
173
        }
174
175
        /**
176
         * Desmarca una p?gina como cargada en cach?.
177
         * @param nPag N?mero de p?gina a desmarcar.
178
         */
179
        public void setPageAsNotLoadInCache(int nPag){
180
                for(int i = 0; i < nBands; i++)
181
                        cache[i].setPageAsNotLoadInCache(nPag);
182
        }
183
184
        /**
185
         * Pone como no modificada una p?gina de cach?
186
         * @param nCachePag N?mero de p?gina de cach? (posici?n de esta)
187
         */
188
        public void unsetModify(int nCachePag){
189
                for(int i = 0; i < nBands; i++)
190
                        cache[i].unsetModify(nCachePag);
191
        }
192
193
        /**
194
         * Pone como no modificada una p?gina de cach?
195
         * @param group Grupo en el que se encuentra la p?gina
196
         * @param posInGroup Posici?n dentro del grupo en el que est? la p?gina
197
         */
198
        public void unsetModify(int group, int posInGroup){
199
                for(int i = 0; i < nBands; i++)
200
                        cache[i].unsetModify(group, posInGroup);
201
        }
202
203
        /**
204
         * Asigna el n?mero de p?gina del raster cargada en una p?gina de cach? especificada.
205
         * @param nCachePage N?mero de p?gina de cach?
206
         * @param nRasterPage N?mero de p?gina de raster a asignar
207
         */
208
        public void setRasterPageNumberInPosition(int nCachePage, int nRasterPage){
209
                for(int i = 0; i < nBands; i++)
210
                        cache[i].setRasterPageNumberInPosition(nCachePage, nRasterPage);
211
        }
212
213
        /**
214
         * Asigna el n?mero de p?gina del raster cargada en una p?gina de cach? especificada.
215
         * @param nCachePage N?mero de p?gina de cach?
216
         * @param nRasterPage N?mero de p?gina de raster a asignar
217
         */
218
        public void setRasterPageNumberInPosition(int group, int posInGroup, int nRasterPage){
219
                for(int i = 0; i < nBands; i++)
220
                        cache[i].setRasterPageNumberInPosition(group, posInGroup, nRasterPage);
221
        }
222
223
        //****************** CONSULTAS A CACHE[0]********************************
224
225
        /**
226
         * Para extraer el desplazamiento de una direcci?n (l?nea de raster) hay que hacer una operaci?n And con
227
         * con la altura de la p?gina -1. Por ejemplo, una p?gina de 16 l?neas de altura el desplazamiento ser?
228
         * 16 - 1 = 15 porque 15 en binario es 1111.
229
         *
230
         * Si queremos acceder a la linea del raster n?mero 83 (1010011) realizando la operaci?n And con el valor del
231
         * desplazamiento obtenemos (0001111 & 1010011 = 0000011), es decir el valor 3 en decimal. Esto quiere decir
232
         * que la l?nea 83 del raster es la 3 de su p?gina.
233
         * @return valor del desplazamiento
234
         */
235
        public int getOffset() {
236
                return cache[0].getOffset();
237
        }
238
239
        /**
240
         * Obtiene el n?mero de bits por p?gina para poder calcular el desplazamiento binario
241
         * de la direcci?n de acceso de la petici?n. Es decir si se solicita un dato en la l?nea
242
         * 36 (en decimal) del raster 100100(en binario) y el desplazamiento es 4 bits el n?mero de
243
         * p?gina resultante ser? 10(en binario) 2 (en decimal)
244
         * @return
245
         */
246
        public int getBitsPag() {
247
                return cache[0].getBitsPag();
248
        }
249
250
        /**
251
         * Array de booleanos donde cada elemento es una p?gina del raster y dice si la p?gina
252
         * est? cacheada o no.
253
         * @return true si la p?gina est? en cach? y false si no lo est?
254
         */
255
        public boolean isInCache(int nPag) {
256
                return cache[0].isInCache(nPag);
257
        }
258
259
        /**
260
         * Obtiene el n?mero de p?gina cargada en el buffer
261
         * @return Entero con el n?mero de p?gina
262
         */
263
        public int getNumberInAccessPage() {
264
                return cache[0].getNumberInAccessPage();
265
        }
266
267
        /**
268
         * Obtiene el n?mero de p?gina de cach? (en formato grupo/p?gina dentro del grupo)
269
         * donde est? cargada la p?gina del raster que se ha pasado por par?metro.
270
         * @param pag P?gina del raster
271
         * @return N?mero de p?gina del raster
272
         */
273
        public int[] getNumberGroupFromNumberRasterPage(int pag){
274
                return cache[0].getNumberGroupFromNumberRasterPage(pag);
275
        }
276
277
        /**
278
         * Obtiene el n?mero de grupos de cach?
279
         * @return N?mero de grupos
280
         */
281
        public int getNGroups() {
282
                return cache[0].getNGroups();
283
        }
284
285
        /**
286
         * Obtiene el n?mero total de p?ginas del raster
287
         * @return N?mero total de p?ginas
288
         */
289
        public int getNTotalPags() {
290
                return cache[0].getNTotalPags();
291
        }
292
293
        /**
294
         * Obtiene el n?mero de p?gina del raster cargada en una p?gina de cach? especificada
295
         * en el par?metro.
296
         * @param group Grupo en el que se encuentra la p?gina
297
         * @param posInGroup Posici?n dentro del grupo en el que est? la p?gina
298
         * @return N?mero de p?gina del raster
299
         */
300
        public int getRasterPageNumberInPosition(int group, int posInGroup){
301
                return cache[0].getRasterPageNumberInPosition(group, posInGroup);
302
        }
303
304
        /**
305
         * Consulta si una p?gina de cach? ha sido modificada desde que se carg? en cach? o no.
306
         * @param nCachePag N?mero de p?gina de cach? (posici?n de esta)
307
         * @return true si ha sido modificada y false si no lo ha sido.
308
         */
309
        public boolean isModified(int nCachePag){
310
                return cache[0].isModified(nCachePag);
311
        }
312
313
        /**
314
         * Consulta si una p?gina de cach? ha sido modificada desde que se carg? en cach? o no.
315
         * @param group Grupo en el que se encuentra la p?gina
316
         * @param posInGroup Posici?n dentro del grupo en el que est? la p?gina
317
         * @return true si ha sido modificada y false si no lo ha sido.
318
         */
319
        public boolean isModified(int group, int posInGroup){
320
                return cache[0].isModified(group, posInGroup);
321
        }
322
323
        /**
324
         * Obtiene el n?mero de p?ginas que tiene cada grupo
325
         * @return Entero con el n?mero de p?ginas por grupo
326
         */
327
        public int getPagsPerGroup() {
328
                return cache[0].getPagsPerGroup();
329
        }
330
        /**
331
         * Obtiene el array que contiene los valores de la antig?edad del acceso dentro del
332
         * grupo. La primera dimensi?n del array corresponde al n?mero de grupo y la segunda
333
         * a los elementos del grupo. El elemento del grupo con un acceso m?s reciente tendr?
334
         * un n?mero menor y el de mayor valor ser? el candidato para la sustituci?n en el pr?ximo
335
         * remplazamiento.
336
         * @return Array bidimensional con los valores de antig?edad.
337
         */
338
        public int[][] getLastAccess() {
339
                return cache[0].getLastAccess();
340
        }
341
342
        /**
343
         * Obtiene el objeto cache de la banda correspondiente al par?metro band
344
         * @param band Banda
345
         * @return Cache
346
         */
347
        public Cache getCache(int band){
348
                return cache[band];
349
        }
350
}