Advertisement
Guest User

Untitled

a guest
Aug 20th, 2015
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.51 KB | None | 0 0
  1. package com.pavelsikun.kotlin.adbautoconnector
  2.  
  3. import java.io.File
  4. import java.nio.file.Files
  5. import java.nio.file.Paths
  6. import java.util.*
  7.  
  8. class FileTransmitter(from: String, to: String, val filter: (File) -> Boolean = {true}) {
  9.  
  10.     var enteredResourceDir: Boolean = false
  11.  
  12.     val fromDirectory = File(from)
  13.     val toDirectory   = File(to)
  14.  
  15.     val nameCollisions = HashMap<String, String>()
  16.     val existingResolutions = ArrayList<String>()
  17.  
  18.     fun action() {
  19.         toDirectory.listFiles()
  20.                 .filter { it.name.contains("drawable-") }
  21.                 .map { it.name }
  22.                 .forEach { existingResolutions.add(it) }
  23.         fromDirectory.toFileEntity().performOperation()
  24.     }
  25.  
  26.  
  27.     fun FileEntity.performOperation() {
  28.         when(this) {
  29.             is Directory -> this.file.listFiles()
  30.                     .map { it.toFileEntity() }
  31.                     .forEach { it.performOperation() }
  32.             is ResourceDirectory -> this.file.listFiles()
  33.                     .map{ it.toFileEntity() }
  34.                     .forEach { it.performOperation() }
  35.             is Resource -> if(filter(this.file)) moveFile(this.file)
  36.         }
  37.     }
  38.  
  39.     fun moveFile(f: File) {
  40.         if (!existingResolutions.contains(f.parent)) return
  41.         val moveToDir = File(toDirectory.getAbsolutePath() + f.parent)
  42.         var name = f.name
  43.         if (moveToDir.listFiles().map{ it.name }.contains(f.name)) {
  44.             name = nameCollisions.getOrElse<String, String>(name, { f.handleNameConflict() })
  45.         }
  46.         Files.copy(
  47.                 Paths.get(f.getAbsolutePath()),
  48.                 Paths.get("${moveToDir.getAbsolutePath()}${File.separator}$name"))
  49.     }
  50.  
  51.  
  52.     interface FileEntity
  53.     data class Directory(val file: File) : FileEntity
  54.     data class ResourceDirectory(val file: File) : FileEntity
  55.     data class Resource(val file: File) : FileEntity
  56.  
  57.  
  58.     inline fun <T> Array<T>.forAll(body: (T) -> Boolean): Boolean {
  59.         var isSuccess = true
  60.         forEach { if(!body(it)) isSuccess = false }
  61.         return isSuccess
  62.     }
  63.  
  64.     fun File.handleNameConflict() = ""
  65.  
  66.     inline fun <K, V> Map<K, V>.getOrElse(key: K, defaultValue: () -> V): V = this[key] ?: defaultValue()
  67.  
  68.     fun File.toFileEntity(): FileEntity {
  69.         if (isDirectory()) {
  70.             if (listFiles().forAll{ it.isDirectory() && it.name.contains("drawable") }) return ResourceDirectory(this)
  71.             else return Directory(this)
  72.         }
  73.         else return Resource(this)
  74.     }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement