/jb/src/main/kotlin/system/Uri.kt

https://github.com/TeamCodeStream/CodeStream · Kotlin · 54 lines · 48 code · 5 blank · 1 comment · 16 complexity · f6e6ae18e5731e95680dea53d310bfb5 MD5 · raw file

  1. package com.codestream.system
  2. private enum class OS {
  3. WINDOWS, UNIX
  4. }
  5. private val os: OS by lazy {
  6. if (System.getProperty("os.name").toLowerCase().contains("win"))
  7. OS.WINDOWS
  8. else
  9. OS.UNIX
  10. }
  11. const val SPACE_ENCODED: String = "%20"
  12. const val COLON_ENCODED: String = "%3A"
  13. const val HASH_ENCODED: String = "%23"
  14. const val URI_FILE_BEGIN = "file:"
  15. const val WINDOWS_NETWORK_FILE_BEGIN = "file:////"
  16. const val URI_PATH_SEP: Char = '/'
  17. const val URI_VALID_FILE_BEGIN: String = "file:///"
  18. fun sanitizeURI(uri: String?): String? {
  19. if (uri == null) {
  20. return null
  21. }
  22. if (uri.startsWith(WINDOWS_NETWORK_FILE_BEGIN)) {
  23. return uri
  24. } else if (!uri.startsWith(URI_FILE_BEGIN)) {
  25. // LOG.warn("Malformed uri : " + uri)
  26. return uri // Probably not an uri
  27. } else {
  28. val reconstructed = StringBuilder()
  29. var uriCp = uri.replace(" ", SPACE_ENCODED) // Don't trust servers
  30. uriCp = uriCp.drop(URI_FILE_BEGIN.length).dropWhile { c -> c == URI_PATH_SEP }
  31. reconstructed.append(URI_VALID_FILE_BEGIN)
  32. return if (os == OS.UNIX) {
  33. reconstructed.append(uriCp).toString()
  34. } else {
  35. reconstructed.append(uriCp.takeWhile { c -> c != URI_PATH_SEP })
  36. val driveLetter = reconstructed[URI_VALID_FILE_BEGIN.length]
  37. if (driveLetter.isLowerCase()) {
  38. reconstructed.setCharAt(URI_VALID_FILE_BEGIN.length, driveLetter.toUpperCase())
  39. }
  40. if (reconstructed.endsWith(COLON_ENCODED)) {
  41. reconstructed.delete(reconstructed.length - 3, reconstructed.length)
  42. }
  43. if (!reconstructed.endsWith(":")) {
  44. reconstructed.append(":")
  45. }
  46. reconstructed.append(uriCp.dropWhile { c -> c != URI_PATH_SEP }).toString()
  47. }
  48. }
  49. }