/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data.shapefile; import static org.geotools.data.shapefile.ShpFileType.PRJ; import static org.geotools.data.shapefile.ShpFileType.SHP; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.util.Arrays; import java.util.Map; import junit.framework.TestCase; public class StorageFileTest extends TestCase implements FileReader { private ShpFiles shpFiles1; private ShpFiles shpFiles2; @Override protected void setUp() throws Exception { super.setUp(); Map<ShpFileType, File> files1 = ShpFilesTest.createFiles("Files1", ShpFileType.values(), false); Map<ShpFileType, File> files2 = ShpFilesTest.createFiles("Files2", ShpFileType.values(), false); shpFiles1 = new ShpFiles(files1.get(SHP)); shpFiles2 = new ShpFiles(files2.get(SHP)); } public void testReplaceOriginal() throws Exception { ShpFiles files1 = shpFiles1; ShpFileType type = PRJ; StorageFile storagePRJ1 = files1.getStorageFile(type); File original = storagePRJ1.getFile(); try { String writtenToStorageFile = "Copy"; writeData(storagePRJ1, writtenToStorageFile); storagePRJ1.replaceOriginal(); assertEquals(0, files1.numberOfLocks()); assertCorrectData(files1, type, writtenToStorageFile); } catch(Exception e) { storagePRJ1.getFile().delete(); original.delete(); } } private void writeData(StorageFile storage, String writtenToStorageFile) throws IOException { File file = storage.getFile(); file.deleteOnExit(); FileWriter writer = new FileWriter(file); writer.write(writtenToStorageFile); writer.close(); } private void assertCorrectData(ShpFiles files1, ShpFileType type, String writtenToStorageFile) throws IOException { ReadableByteChannel channel = files1.getReadChannel(type, this); try { ByteBuffer buffer = ByteBuffer.allocate(20); channel.read(buffer); buffer.flip(); String data = new String(buffer.array()).trim(); assertEquals(writtenToStorageFile, data); } finally { channel.close(); } } public void testReplaceOriginals() throws Exception { StorageFile storagePRJ1 = shpFiles1.getStorageFile(PRJ); StorageFile storageSHP1 = shpFiles1.getStorageFile(SHP); StorageFile storagePRJ2 = shpFiles2.getStorageFile(PRJ); StorageFile storageSHP2 = shpFiles2.getStorageFile(SHP); try { String sPRJ1 = "storagePRJ1"; String sSHP1 = "storageSHP1"; String sPRJ2 = "storagePRJ2"; String sSHP2 = "storageSHP2"; writeData(storagePRJ1, sPRJ1); writeData(storageSHP1, sSHP1); writeData(storagePRJ2, sPRJ2); writeData(storageSHP2, sSHP2); StorageFile.replaceOriginals(storagePRJ1, storagePRJ2, storageSHP1, storageSHP2, storageSHP2); this.assertCorrectData(shpFiles1, PRJ, sPRJ1); this.assertCorrectData(shpFiles1, SHP, sSHP1); this.assertCorrectData(shpFiles2, PRJ, sPRJ2); this.assertCorrectData(shpFiles2, SHP, sSHP2); assertEquals(0, shpFiles1.numberOfLocks()); assertEquals(0, shpFiles2.numberOfLocks()); } finally { storagePRJ1.getFile().delete(); storagePRJ2.getFile().delete(); storageSHP1.getFile().delete(); storageSHP2.getFile().delete(); } } public void testReplaceOriginalsEmptyArgs() throws Exception { StorageFile.replaceOriginals(new StorageFile[0]); } public void testCompareTo() throws IOException { StorageFile storagePRJ1 = shpFiles1.getStorageFile(PRJ); StorageFile storageSHP1 = shpFiles1.getStorageFile(SHP); StorageFile storagePRJ2 = shpFiles2.getStorageFile(PRJ); StorageFile storageSHP2 = shpFiles2.getStorageFile(SHP); try { assertFalse(storagePRJ1.compareTo(storageSHP1) == 0); assertFalse(storagePRJ1.compareTo(storagePRJ2) == 0); StorageFile[] array = new StorageFile[] { storagePRJ1, storagePRJ2, storageSHP1, storageSHP2 }; Arrays.sort(array); assertFalse(array[0].compareTo(array[1]) == 0); assertFalse(array[2].compareTo(array[3]) == 0); assertFalse(array[1].compareTo(array[2]) == 0); } finally { storagePRJ1.getFile().delete(); storagePRJ2.getFile().delete(); storageSHP1.getFile().delete(); storageSHP2.getFile().delete(); } } public String id() { return getClass().getName(); } }