Revision 2259

View differences:

org.gvsig.raster/branches/org.gvsig.raster_dataaccess_refactoring/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/buffer/DefaultRasterQuery.java
391 391
		Extent requestBBox = getRequestBoundingBox();
392 392
		Point2D ul = store.worldToRaster(requestBBox.getUL());
393 393
		Point2D lr = store.worldToRaster(requestBBox.getLR());
394
		int w = (int)Math.ceil(Math.abs(ul.getX() - lr.getX()));
395
		int h = (int)Math.ceil(Math.abs(ul.getY() - lr.getY()));
394
		int w = (int)Math.ceil(Math.abs(round(ul.getX()) - round(lr.getX())));
395
		int h = (int)Math.ceil(Math.abs(round(ul.getY()) - round(lr.getY())));
396 396
		Rectangle r = new Rectangle((int)ul.getX(), (int)ul.getY(), w, h);
397 397
		pixelWindow = r;
398 398

  
399 399
		Extent adjustedBBox = getAdjustedRequestBoundingBox();
400 400
		ul = store.worldToRaster(adjustedBBox.getUL());
401 401
		lr = store.worldToRaster(adjustedBBox.getLR());
402
		w = (int)Math.ceil(Math.abs(ul.getX() - lr.getX()));
403
		h = (int)Math.ceil(Math.abs(ul.getY() - lr.getY()));
402
		w = (int)Math.ceil(Math.abs(round(ul.getX()) - round(lr.getX())));
403
		h = (int)Math.ceil(Math.abs(round(ul.getY()) - round(lr.getY())));
404 404
		r = new Rectangle((int)ul.getX(), (int)ul.getY(), w, h);
405 405
		adjustedPixelWindow = r;
406 406
	}
org.gvsig.raster/branches/org.gvsig.raster_dataaccess_refactoring/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/provider/tile/TileDownloaderForFiles.java
87 87
				if(bufResult == null) {
88 88
					RasterQuery q = RasterLocator.getManager().createQuery();
89 89
					q.setAreaOfInterest(tileExtent, this.tilePxWidth, this.tilePxHeight);
90
					q.setAllDrawableBands();
90 91
					q.setAdjustToExtent(true); 
91 92
					bufResult = store.query(q);
92 93
				}
org.gvsig.raster/branches/org.gvsig.raster_dataaccess_refactoring/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/AbstractRasterDataStore.java
179 179
		currentQuery = (DefaultRasterQuery)query;
180 180
		DefaultRasterQuery q = currentQuery;
181 181
		
182
		/*if(q.getDrawableBands() != null)
183
			setQueryDrawableBands(q.getDrawableBands());
184
		else 
185
			setQueryAllDrawableBands();*/
186
		
187 182
		Buffer buf = null;
188 183
		
189 184
		if(q.isSupersamplingOptionActive() && q.isSupersamplingTheRequest()) {
......
242 237
		return lastBuffer;
243 238
	}
244 239
	
245
	/**
246
	 * Para este GeoRasterFile asigna que bandas se pintaran
247
	 * sobre el RasterBuf cuando se haga un update. Cada posici?n del vector es una banda
248
	 * del rasterBuf y el contenido de esa posici?n es la banda de la imagen que se dibujar?
249
	 * sobre ese RasterBuf.
250
	 * @param drawableBands	Array con las bandas a dibujar.
251
	 * @return array con tantos elementos como bandas a dibujar. El valor contenido es el fichero del
252
	 * dataset multifichero al que corresponde la banda.
253
	 */
254
	/*private void setQueryDrawableBands(int[] drawableBands) {
255
		//clearDrawableBands();
256
		setDrawableBands(drawableBands);
257

  
258
		int[] files = new int[drawableBands.length];
259
		palette = new ColorTable[drawableBands.length];
260

  
261
		for(int i = 0; i< drawableBands.length; i++) {
262
			if(drawableBands[i] < 0 || drawableBands[i] >= getBandCount())
263
				continue;
264
			//addDrawableBand(i, drawableBands[i]);
265
			String fileName = getBands().getBand(drawableBands[i]).getFileName();
266
			files[i] = getBands().getFileNumber(fileName);
267
			palette[i] = getColorTable(fileName);
268
		}
269
	}*/
270
	
271
	/**
272
	 * Para este GeoRasterFile asigna que bandas se pintaran
273
	 * sobre el RasterBuf cuando se haga un update. Cada posici�n del vector es una banda
274
	 * del rasterBuf y el contenido de esa posici�n es la banda de la imagen que se dibujar�
275
	 * sobre ese RasterBuf. Esta llamada asigna todas las bandas dibujables en su orden natural.
276
	 * @return array con tantos elementos como bandas a dibujar. El valor contenido es el fichero del
277
	 * dataset multifichero al que corresponde la banda.
278
	 */
279
	/*public int[] setQueryAllDrawableBands() {
280
		clearDrawableBands();
281
		
282
		int[] list = new int[getBandCount()];
283
		for(int i = 0; i< getBandCount(); i++)
284
			list[i] = i;
285
		setDrawableBands(list);
286
		
287
		int[] files = new int[getBandCount()];
288
		palette = new ColorTable[getBandCount()];
289

  
290
		for(int i = 0; i< getBandCount(); i++) {
291
			addDrawableBand(i, i);
292
			String fileName = getBands().getBand(i).getFileName();
293
			files[i] = getBands().getFileNumber(fileName);
294
			palette[i] = getColorTable(fileName);
295
		}
296
		return files;
297
	}*/
298
	
299 240
	public TimeSeries getTimeSerials() throws RmfSerializerException {
300 241
		if(getProvider() instanceof RasterProvider)
301 242
			return ((RasterProvider)getProvider()).getTimeSerials();
org.gvsig.raster.ermapper/branches/org.gvsig.raster.ermapper_dataaccess_refactoring/pom.xml
3 3
	<modelVersion>4.0.0</modelVersion>
4 4
	<artifactId>org.gvsig.raster.ermapper</artifactId>
5 5
	<packaging>pom</packaging>
6
	<version>2.1.0-SNAPSHOT</version>
6
	<version>2.2.0-SNAPSHOT</version>
7 7
	<name>org.gvsig.raster.ermapper</name>
8 8
	<description>Ermapper data provider for gvSIG</description>
9 9
	<inceptionYear>2011</inceptionYear>
......
38 38
			<dependency>
39 39
				<groupId>org.gvsig</groupId>
40 40
				<artifactId>org.gvsig.raster.lib.api</artifactId>
41
				<version>2.1.0-SNAPSHOT</version>
41
				<version>2.2.0-SNAPSHOT</version>
42 42
			</dependency>
43 43
	        <dependency>
44 44
		        <groupId>org.gvsig</groupId>
45 45
		        <artifactId>org.gvsig.raster.lib.impl</artifactId>
46
		        <version>2.1.0-SNAPSHOT</version>
46
		        <version>2.2.0-SNAPSHOT</version>
47 47
		    </dependency>
48 48
		    <dependency>
49 49
				<groupId>org.gvsig</groupId>
......
65 65
	    	<dependency>
66 66
				<groupId>org.gvsig</groupId>
67 67
				<artifactId>org.gvsig.raster.ermapper.io</artifactId>
68
				<version>2.1.0-SNAPSHOT</version>
68
				<version>2.2.0-SNAPSHOT</version>
69 69
			</dependency>  
70 70
			<dependency>
71 71
				<groupId>com.ermapper</groupId>
org.gvsig.raster.ermapper/branches/org.gvsig.raster.ermapper_dataaccess_refactoring/org.gvsig.raster.ermapper.app/pom.xml
9 9
	<parent>
10 10
      <groupId>org.gvsig</groupId>
11 11
      <artifactId>org.gvsig.raster.ermapper</artifactId>
12
      <version>2.1.0-SNAPSHOT</version>
12
      <version>2.2.0-SNAPSHOT</version>
13 13
    </parent>
14 14
    <scm>
15 15
        <connection>scm:svn:https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.ermapper/trunk/org.gvsig.raster.ermapper/org.gvsig.raster.ermapper.app</connection>
org.gvsig.raster.ermapper/branches/org.gvsig.raster.ermapper_dataaccess_refactoring/org.gvsig.raster.ermapper.io/src/main/java/org/gvsig/raster/ermapper/io/ErmapperProvider.java
22 22
package org.gvsig.raster.ermapper.io;
23 23

  
24 24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.NoninvertibleTransformException;
26 25
import java.awt.geom.Point2D;
27 26
import java.io.BufferedReader;
28 27
import java.io.File;
......
49 48
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
50 49
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
51 50
import org.gvsig.metadata.MetadataLocator;
52
import org.gvsig.raster.cache.tile.provider.TileListener;
53 51
import org.gvsig.raster.cache.tile.provider.TileServer;
52
import org.gvsig.raster.impl.buffer.SpiRasterQuery;
54 53
import org.gvsig.raster.impl.datastruct.ExtentImpl;
55 54
import org.gvsig.raster.impl.process.RasterTask;
56 55
import org.gvsig.raster.impl.process.RasterTaskQueue;
57
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
56
import org.gvsig.raster.impl.provider.AbstractRasterProvider;
58 57
import org.gvsig.raster.impl.provider.RasterProvider;
59 58
import org.gvsig.raster.impl.provider.tile.FileTileServer;
60 59
import org.gvsig.raster.impl.store.AbstractRasterDataParameters;
60
import org.gvsig.raster.impl.store.DefaultRasterStore;
61 61
import org.gvsig.raster.impl.store.DefaultStoreFactory;
62 62
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
63 63
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
......
74 74
 *
75 75
 * @author Nacho Brodin (nachobrodin@gmail.com)
76 76
 */
77
public class ErmapperProvider extends DefaultRasterProvider implements JNCSProgressiveUpdate {
77
public class ErmapperProvider extends AbstractRasterProvider implements JNCSProgressiveUpdate {
78 78
	//private static final Logger           logger                   = LoggerFactory.getLogger(ErmapperProvider.class);
79 79
	public static String                  NAME                     = "Ermapper Store";
80 80
	public static String                  DESCRIPTION              = "Ermapper Raster file";
......
251 251
		return null;
252 252
	}
253 253

  
254
	/*
255
	 * (non-Javadoc)
256
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
257
	 */
258 254
	public RasterProvider load() {
259 255
		ownTransformation = new AffineTransform(file.cellIncrementX, 0, 0, file.cellIncrementY, file.originX, file.originY);
260 256
		externalTransformation = (AffineTransform) ownTransformation.clone();
261 257
		return this;
262 258
	}
263 259
	
264
	/*
265
	 * (non-Javadoc)
266
	 * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
267
	 */
268 260
	public boolean isOpen() {
269 261
		return open;
270 262
	}
271 263

  
272
	/*
273
	 * (non-Javadoc)
274
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
275
	 */
276 264
	public void close() {
277 265
		if(file != null) {
278 266
			open = false;
......
283 271
		}
284 272
	}
285 273

  
286
	/*
287
	 * (non-Javadoc)
288
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
289
	 */
290 274
	public Transparency getTransparency() {
291 275
		if(fileTransparency == null)
292 276
			fileTransparency = new DataStoreTransparency();
293 277
		return fileTransparency;
294 278
	}
295 279

  
296
	/*
297
	 * (non-Javadoc)
298
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
299
	 */
300 280
	public double getWidth() {
301 281
		return file.width;
302 282
	}
303 283

  
304
	/*
305
	 * (non-Javadoc)
306
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
307
	 */
308 284
	public double getHeight() {
309 285
		return file.height;
310 286
	}
311 287

  
312
	/*
313
	 * (non-Javadoc)
314
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
315
	 */
316 288
	public Extent getView() {
317 289
		return viewRequest;
318 290
	}
319 291

  
320
	/*
321
	 * (non-Javadoc)
322
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
323
	 */
324 292
	public void setView(Extent e) {
325 293
		viewRequest = new ExtentImpl(e);
326 294
	}
327 295
	
328
	/*
329
	 * (non-Javadoc)
330
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
331
	 */
332
	public void getWindow(Extent ex, int bufWidth, int bufHeight, 
333
			BandList bandList, TileListener listener, TaskStatus status)throws ProcessInterruptedException, RasterDriverException {
334
		 
296
	@Override
297
	public void loadBuffer(SpiRasterQuery query)
298
			throws ProcessInterruptedException, RasterDriverException {
299
		setView(query.getAdjustedRequestBoundingBox());
300
		int bufWidth = query.getAdjustedBufWidth();
301
		int bufHeight = query.getAdjustedBufHeight();
302
		int[] stpBuffer = new int[]{0, 0 , bufWidth, bufHeight};
303
		loadBuffer(viewRequest, 
304
				bufWidth, 
305
				bufHeight, 
306
				query.getBufferForProviders(), 
307
				query.getBandList(), 
308
				stpBuffer, 
309
				query.getTaskStatus());
335 310
	}
311
	
336 312

  
337
	/*
338
	 * (non-Javadoc)
339
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
340
	 */
341
	public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
313
	/*public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
342 314
		throws ProcessInterruptedException, RasterDriverException {
343 315
		
344 316
		if(status != null && status.isCancelled())
......
368 340
			return null;
369 341
		
370 342
		return rasterBuf;
371
	}
343
	}*/
372 344

  
373
	/*
374
	 * (non-Javadoc)
375
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
376
	 */
377
	public Buffer getWindow(double ulx, double uly, double w, double h, 
345
	/*public Buffer getWindow(double ulx, double uly, double w, double h, 
378 346
			BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
379 347
		//El incremento o decremento de las X e Y depende de los signos de rotaci?n y escala en la matriz de transformaci?n. Por esto
380 348
		//tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h
......
420 388
			return null;
421 389
		
422 390
		return rasterBuf;
423
	}
391
	}*/
424 392

  
425
	/*
426
	 * (non-Javadoc)
427
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
428
	 */
429
	public Buffer getWindow(Extent extent, int bufWidth, int bufHeight,
393
	/*public Buffer getWindow(Extent extent, int bufWidth, int bufHeight,
430 394
			BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
431 395
		
432 396
		if(status != null && status.isCancelled())
......
460 424
			return null;
461 425
		
462 426
		return rasterBuf;
463
	}
427
	}*/
464 428
	
465
	/*
466
	 * (non-Javadoc)
467
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
468
	 */
469
	public Buffer getWindow(int x, int y, int w, int h, 
429
	/*public Buffer getWindow(int x, int y, int w, int h, 
470 430
			BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
471 431
		
472 432
		if(status != null && status.isCancelled())
......
484 444
			return null;
485 445
		
486 446
		return rasterBuf;
487
	}
447
	}*/
488 448

  
489 449
	/**
490 450
	 * Carga el buffer con las bandas RGB del raster con los par?metros especificados de extensi?n
......
714 674
	public void reProject(ICoordTrans rp) {
715 675
	}
716 676

  
717
	/*
718
	 * (non-Javadoc)
719
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
720
	 */
721 677
	public int getBlockSize() {
722 678
		return 0;
723 679
	}
724 680

  
725
	/*
726
	 * (non-Javadoc)
727
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
728
	 */
729 681
	public Object readCompleteLine(int line, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
730 682
		if(line < 0 || line >= file.height || band < 0 || band >= getBandCount())
731 683
			throw new InvalidSetViewException("Request out of grid");
......
783 735
		return null;
784 736
	}
785 737

  
786
	/*
787
	 * (non-Javadoc)
788
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readBlock(int, int)
789
	 */
790 738
	public Object readBlock(int pos, int blockHeight, double scale) throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
791 739
		RasterTask task = RasterTaskQueue.get(Thread.currentThread().getId() + "");
792 740
		if(pos < 0)
......
849 797
		return buf;
850 798
	}
851 799

  
852
	/*
853
	 * (non-Javadoc)
854
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
855
	 */
856 800
	public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
857 801
		if(x < 0 || y < 0 || x >= file.width || y >= file.height)
858 802
			throw new InvalidSetViewException("Request out of grid");
......
893 837
		}
894 838
	}
895 839

  
896
	/*
897
	 * (non-Javadoc)
898
	 * @see com.ermapper.ecw.JNCSProgressiveUpdate#refreshUpdate(int, int, double, double, double, double)
899
	 */
900 840
	public void refreshUpdate(int arg0, int arg1, double arg2, double arg3, double arg4, double arg5) {
901 841
	}
902 842

  
903
	/*
904
	 * (non-Javadoc)
905
	 * @see com.ermapper.ecw.JNCSProgressiveUpdate#refreshUpdate(int, int, int, int, int, int)
906
	 */
907 843
	public void refreshUpdate(int arg0, int arg1, int arg2, int arg3, int arg4, int arg5) {
908 844
	}
909 845

  
910
	/*
911
	 * (non-Javadoc)
912
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation()
913
	 */
914 846
	public DataStoreColorInterpretation getColorInterpretation(){
915 847
		if(colorInterpr == null) {
916 848
			colorInterpr = new DataStoreColorInterpretation();
......
926 858
		return colorInterpr;
927 859
	}
928 860

  
929
	/*
930
	 * (non-Javadoc)
931
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
932
	 */
933 861
	public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
934 862
		if(band >= getBandCount())
935 863
			throw new BandAccessException("Wrong band");
936 864
		return 0;
937 865
	}
938 866

  
939
	/*
940
	 * (non-Javadoc)
941
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
942
	 */
943 867
	public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
944 868
		if (band >= getBandCount())
945 869
			throw new BandAccessException("Wrong band");
946 870
		return 0;
947 871
	}
948 872

  
949
	/*
950
	 * (non-Javadoc)
951
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
952
	 */
953 873
	public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
954 874
		if (band >= getBandCount())
955 875
			throw new BandAccessException("Wrong band");
956 876
		return 0;
957 877
	}
958 878

  
959
	/*
960
	 * (non-Javadoc)
961
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
962
	 */
963 879
	public boolean isOverviewsSupported() {
964 880
		return false;
965 881
	}
......
969 885
		return file.projection;
970 886
	}
971 887

  
972
	/*
973
	 * (non-Javadoc)
974
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWktProjection()
975
	 */
976 888
	public String getWktProjection() {
977 889
		return null;
978 890
	}
979 891
	
980
	/*
981
	 * (non-Javadoc)
982
	 * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
983
	 */
984 892
	public String getName() {
985 893
		return NAME;
986 894
	}
987 895
	
988
	/*
989
	 * (non-Javadoc)
990
	 * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
991
	 */
992 896
	public void setStatus(RasterProvider provider) {
993 897
		if(provider instanceof ErmapperProvider) {
994 898
			//Not implemented yet
995 899
		}
996 900
	}
997 901
	
998
	/*
999
	 * (non-Javadoc)
1000
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isSupersamplingSupported()
1001
	 */
1002 902
	public boolean isSupersamplingSupported() {
1003 903
		return false;
1004 904
	}
1005 905
	
1006
	/*
1007
	 * (non-Javadoc)
1008
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
1009
	 */
1010 906
	public TileServer getTileServer() {
1011
		if(tileServer == null)
1012
			tileServer = new FileTileServer(this);
907
		if(tileServer == null) {
908
			DefaultRasterStore store = new DefaultRasterStore();
909
			store.setProvider(this);
910
			tileServer = new FileTileServer(store);
911
		}
1013 912
		return tileServer;
1014 913
	}
1015
	
1016 914
}
org.gvsig.raster.ermapper/branches/org.gvsig.raster.ermapper_dataaccess_refactoring/org.gvsig.raster.ermapper.io/pom.xml
7 7
	<parent>
8 8
		<groupId>org.gvsig</groupId>
9 9
		<artifactId>org.gvsig.raster.ermapper</artifactId>
10
		<version>2.1.0-SNAPSHOT</version>
10
		<version>2.2.0-SNAPSHOT</version>
11 11
	</parent>
12 12
	<dependencies>
13 13
		<dependency>
14 14

  

Also available in: Unified diff