
geotrellis.spark.io.file.FileLayerMover.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of geotrellis-spark_2.10 Show documentation
Show all versions of geotrellis-spark_2.10 Show documentation
GeoTrellis is an open source geographic data processing engine for high performance applications.
The newest version!
package geotrellis.spark.io.file
import geotrellis.spark._
import geotrellis.spark.io._
import geotrellis.spark.io.avro._
import geotrellis.spark.io.index._
import geotrellis.util._
import AttributeStore.Fields
import spray.json.JsonFormat
import org.apache.avro.Schema
import scala.reflect.ClassTag
import java.io.File
object FileLayerMover {
def apply(sourceAttributeStore: FileAttributeStore, targetAttributeStore: FileAttributeStore): LayerMover[LayerId] =
new LayerMover[LayerId] {
def move[
K: AvroRecordCodec: Boundable: JsonFormat: ClassTag,
V: AvroRecordCodec: ClassTag,
M: JsonFormat: GetComponent[?, Bounds[K]]
](from: LayerId, to: LayerId): Unit = {
if(targetAttributeStore.layerExists(to))
throw new LayerExistsError(to)
val sourceMetadataFile = sourceAttributeStore.attributeFile(from, Fields.metadata)
if(!sourceMetadataFile.exists) throw new LayerNotFoundError(from)
// Read the metadata file out.
val LayerAttributes(header, metadata, keyIndex, writerSchema) = try {
sourceAttributeStore.readLayerAttributes[FileLayerHeader, M, K](from)
} catch {
case e: AttributeNotFoundError => throw new LayerReadError(from).initCause(e)
}
// Move over any other attributes
for((attributeName, file) <- sourceAttributeStore.attributeFiles(to)) {
if(file.getAbsolutePath != sourceMetadataFile.getAbsolutePath) {
val source = file.getAbsolutePath
val target = targetAttributeStore.attributeFile(to, attributeName).getAbsolutePath
Filesystem.move(source, target)
}
}
val sourceLayerPath = new File(sourceAttributeStore.catalogPath, header.path)
val targetHeader = header.copy(path = LayerPath(to))
targetAttributeStore.writeLayerAttributes(to, targetHeader, metadata, keyIndex, writerSchema)
// Delete the metadata file in the source
sourceMetadataFile.delete()
// Move all the elements
val targetLayerPath = Filesystem.ensureDirectory(LayerPath(targetAttributeStore.catalogPath, to))
sourceLayerPath
.listFiles()
.foreach { f =>
val target = new File(targetLayerPath, f.getName)
Filesystem.move(f, target)
}
// Clear the caches
sourceAttributeStore.clearCache()
targetAttributeStore.clearCache()
}
}
def apply(catalogPath: String): LayerMover[LayerId] =
apply(FileAttributeStore(catalogPath))
def apply(attributeStore: FileAttributeStore): LayerMover[LayerId] =
apply(attributeStore, attributeStore)
def apply(sourceCatalogPath: String, targetCatalogPath: String): LayerMover[LayerId] =
apply(FileAttributeStore(sourceCatalogPath), FileAttributeStore(targetCatalogPath))
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy