Cleanup (formatting)
[idea/community.git] / platform / projectModel-api / src / com / intellij / configurationStore / StreamProvider.kt
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.configurationStore
3
4 import com.intellij.openapi.components.RoamingType
5 import com.intellij.openapi.util.io.BufferExposingByteArrayOutputStream
6 import org.jetbrains.annotations.TestOnly
7 import java.io.InputStream
8
9 interface StreamProvider {
10   /**
11    * Whether is enabled.
12    */
13   val enabled: Boolean
14     get() = true
15
16   /**
17    * Whether is exclusive and cannot be used alongside another provider.
18    *
19    * Doesn't imply [enabled], callers should check [enabled] also if need.
20    */
21   val isExclusive: Boolean
22
23   @Deprecated("Export action is not disabled by StreamProviders anymore", ReplaceWith("false"))
24   val isDisableExportAction: Boolean
25     get() = false
26
27   /**
28    * Called only on `write`
29    */
30   fun isApplicable(fileSpec: String, roamingType: RoamingType = RoamingType.DEFAULT): Boolean = true
31
32   /**
33    * @param fileSpec
34    * @param content bytes of content, size of array is not actual size of data, you must use `size`
35    * @param size actual size of data
36    */
37   fun write(fileSpec: String, content: ByteArray, size: Int = content.size, roamingType: RoamingType = RoamingType.DEFAULT)
38
39   fun write(path: String, content: BufferExposingByteArrayOutputStream, roamingType: RoamingType = RoamingType.DEFAULT): Unit = write(path, content.internalBuffer, content.size(), roamingType)
40
41   /**
42    * `true` if provider is applicable for file.
43    */
44   fun read(fileSpec: String, roamingType: RoamingType = RoamingType.DEFAULT, consumer: (InputStream?) -> Unit): Boolean
45
46   /**
47    * `true` if provider is fully responsible and local sources must be not used.
48    */
49   fun processChildren(path: String, roamingType: RoamingType, filter: (name: String) -> Boolean, processor: (name: String, input: InputStream, readOnly: Boolean) -> Boolean): Boolean
50
51   /**
52    * Delete file or directory
53    *
54    * `true` if provider is fully responsible and local sources must be not used.
55    */
56   fun delete(fileSpec: String, roamingType: RoamingType = RoamingType.DEFAULT): Boolean
57 }
58
59 @TestOnly
60 fun StreamProvider.write(path: String, content: String) {
61   write(path, content.toByteArray())
62 }