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 | } |