Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit df0dfb5

Browse files
author
Vadim Yaroschuk
authored
refactor&feat: plugins-api update (#34)
* feat: `ProjectsManager` added (only as design proposal) * refactor&chore: `Manager` -> `Container` renaming + updated api in order to #26 * fix: added annotation to suppress warning * fix: added `data` to `Localized<T>` (it may occur some errors while equaling * feat: added `strings` that contains app localization * refactor: variable names changed * refactor: `PluginApiManager` renamed into `PluginApiContainer` * feat: added `register(T)` for adding templates * refactor: `CodeeString` moved to `app-core` module * fix: imports fixed * feat: added implementations for `plugins-api` * refactor: `themeContainer` -> `themes` * refactor: imports fixed * refactor: `Plugin` renamed into `PluginScope` & `metadata` moved into `MetadataScope` * feat: added `DependenciesScope` for declaring external plugin dependencies. * feat: added `CoroutineScope` and information about where exactly it works * feat: added `kotlin-script` dependencies * feat: added `plugins-loader` module * refactor: `DependenciesScope` moved to `MetadataScope` as `dependencies` * update: little changes * fix: updated gradle version in order to android studio error (in bumblebee version) * Feat#30 (#31) * feat: added dependency resolver * feat: added plugin files loaders * feat: added plugin loader * feat: added basic jvm host dependency * refactor: changed extension of file definitions * feat: added classpath adding to `main.plugin.kts` * style&refactor: code style optimization & unnecessary imports removed * refactor: hardcoded plugins replaced with constants * feat: `plugins-loader` module converted to android library * refactor: `MetadataScope` -> `ManifestScope` * feat: `plugins-api` reimplemented * refactor: `localizations` -> `registered` * refactor: `all` -> `registered` * feat: added shortcuts * feat: classpath resolving added * fix: added missing `PluginLocalizationContainer` * fix: added missing `PluginLocalizationContainer` * feat: plugin loading divided in interfaces and different implementations * feat: added files api for plugins (#33)
1 parent 923e29e commit df0dfb5

23 files changed

+453
-80
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.codee.app.core.internal
2+
3+
import java.math.BigInteger
4+
import java.security.MessageDigest
5+
6+
internal fun String.toMD5(): String {
7+
val md = MessageDigest.getInstance("MD5")
8+
val bigInt = BigInteger(1, md.digest(toByteArray(Charsets.UTF_8)))
9+
return String.format("%032x", bigInt)
10+
}
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
package com.codee.app.core.plugins
22

3+
import com.codee.app.core.ContextDI
4+
import com.codee.app.core.internal.toMD5
35
import com.codee.app.core.plugins.container.AppContainer
46
import com.codee.app.core.plugins.container.PluginApiContainer
57
import com.codee.app.core.plugins.container.PluginLocalizationContainer
68
import com.codee.app.core.plugins.container.ProjectTemplatesContainer
9+
import com.codee.app.core.plugins.files.RootDirectoryStorageElement
10+
import com.codee.app.plugins.api.files.DirectoryStorageElement
711
import kotlinx.coroutines.Dispatchers
12+
import java.io.File
813
import kotlin.coroutines.CoroutineContext
914
import com.codee.app.plugins.api.PluginScope as IPluginScope
1015

11-
class PluginScope(metadata: PluginMetadata) : IPluginScope {
16+
class PluginScope(privatevalmetadata: PluginMetadata) : IPluginScope {
1217
override val app: AppContainer = AppContainer
1318
override val apis: PluginApiContainer =
1419
PluginApiContainer(pluginWithMetadataOrNew(metadata, this))
1520
override val localizations: PluginLocalizationContainer =
1621
PluginLocalizationContainer(pluginWithMetadataOrNew(metadata, this))
1722
override val templates: ProjectTemplatesContainer =
1823
ProjectTemplatesContainer(pluginWithMetadataOrNew(metadata, this))
24+
override val workingDir: DirectoryStorageElement.RootDirectoryStorageElement
25+
get() = RootDirectoryStorageElement(
26+
File(
27+
ContextDI.context.filesDir,
28+
"plugins/storage/${(metadata.name + metadata.author).toMD5()}"
29+
)
30+
)
1931
override val coroutineContext: CoroutineContext = Dispatchers.Main
2032
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.codee.app.core.plugins.files
2+
3+
import com.codee.app.plugins.api.files.DirectoryStorageElement
4+
import com.codee.app.plugins.api.files.StorageElement
5+
import kotlinx.coroutines.Dispatchers
6+
import kotlinx.coroutines.withContext
7+
import java.io.File
8+
import com.codee.app.plugins.api.files.DirectoryStorageElement.ChildDirectoryStorageElement as IChildDirectoryStorageElement
9+
10+
class ChildDirectoryStorageElement(private val rootDirectory: File, private val origin: File) :
11+
IChildDirectoryStorageElement {
12+
override val parent: DirectoryStorageElement
13+
get() = if (origin.parentFile!!.absolutePath == rootDirectory.absolutePath)
14+
RootDirectoryStorageElement(origin.parentFile!!)
15+
else ChildDirectoryStorageElement(rootDirectory, origin)
16+
17+
override suspend fun delete(): Unit = withContext(Dispatchers.IO) {
18+
origin.delete()
19+
}
20+
21+
override fun get(name: String): StorageElement {
22+
val file = File(origin, name)
23+
if (file.absolutePath.startsWith(origin.absolutePath)) {
24+
return if (!file.exists())
25+
EmptyStorageElement(file, origin)
26+
else if (file.isFile)
27+
FileStorageElement(file, rootDirectory)
28+
else ChildDirectoryStorageElement(origin, file)
29+
} else throw SecurityException("Unable to get file at ${file.absolutePath}, you don't have such permission.")
30+
}
31+
32+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codee.app.core.plugins.files
2+
3+
import java.io.File
4+
import com.codee.app.plugins.api.files.EmptyStorageElement as IEmptyStorageElement
5+
6+
class EmptyStorageElement(private val origin: File, private val rootDirectory: File) :
7+
IEmptyStorageElement {
8+
override suspend fun mkdir(): ChildDirectoryStorageElement {
9+
origin.mkdir()
10+
return ChildDirectoryStorageElement(origin, rootDirectory)
11+
}
12+
13+
override suspend fun createNewFile(): FileStorageElement {
14+
origin.createNewFile()
15+
return FileStorageElement(origin, rootDirectory)
16+
}
17+
18+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.codee.app.core.plugins.files
2+
3+
import kotlinx.coroutines.Dispatchers
4+
import kotlinx.coroutines.withContext
5+
import java.io.File
6+
import com.codee.app.plugins.api.files.FileStorageElement as IFileStorageElement
7+
8+
class FileStorageElement internal constructor(
9+
private val origin: File,
10+
private val rootDirectory: File
11+
) : IFileStorageElement {
12+
override suspend fun read(): ByteArray = withContext(Dispatchers.IO) {
13+
return@withContext origin.readBytes()
14+
}
15+
16+
override suspend fun write(bytes: ByteArray) = withContext(Dispatchers.IO) {
17+
origin.writeBytes(bytes)
18+
}
19+
20+
override suspend fun delete(): EmptyStorageElement = withContext(Dispatchers.IO) {
21+
origin.delete()
22+
return@withContext EmptyStorageElement(origin, rootDirectory)
23+
}
24+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codee.app.core.plugins.files
2+
3+
import com.codee.app.plugins.api.files.StorageElement
4+
import java.io.File
5+
import com.codee.app.plugins.api.files.DirectoryStorageElement.RootDirectoryStorageElement as IRootDirectoryStorageElement
6+
7+
class RootDirectoryStorageElement(private val origin: File) : IRootDirectoryStorageElement {
8+
override fun get(name: String): StorageElement {
9+
val file = File(origin, name)
10+
if (file.absolutePath.startsWith(origin.absolutePath)) {
11+
return if (!file.exists())
12+
EmptyStorageElement(file, origin)
13+
else if (file.isFile)
14+
FileStorageElement(file, origin)
15+
else ChildDirectoryStorageElement(origin, file)
16+
} else throw SecurityException("Unable to get file at ${file.absolutePath}, you don't have such permission.")
17+
}
18+
}

‎build.gradle.kts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ buildscript {
66
dependencies {
77
classpath(androidBuildTools)
88
classpath(kotlinGradlePlugin)
9-
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21")
109
}
1110
}
1211

‎plugins-api/src/main/kotlin/com/codee/app/plugins/api/PluginScope.kt‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.codee.app.plugins.api.container.AppContainer
44
import com.codee.app.plugins.api.container.PluginApiContainer
55
import com.codee.app.plugins.api.container.PluginLocalizationContainer
66
import com.codee.app.plugins.api.container.ProjectTemplatesContainer
7+
import com.codee.app.plugins.api.files.DirectoryStorageElement
78
import kotlinx.coroutines.CoroutineScope
89
import kotlinx.coroutines.Dispatchers
910
import kotlin.coroutines.CoroutineContext
@@ -32,4 +33,9 @@ public interface PluginScope : CoroutineScope {
3233
* Projects manager.
3334
*/
3435
public val templates: ProjectTemplatesContainer
36+
37+
/**
38+
* The root directory of plugin dedicated storage.
39+
*/
40+
public val workingDir: DirectoryStorageElement.RootDirectoryStorageElement
3541
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.codee.app.plugins.api.container
2+
3+
import com.codee.app.plugins.api.PluginLocalization
4+
import kotlinx.coroutines.flow.SharedFlow
5+
6+
public interface PluginLocalizationContainer {
7+
public val registered: SharedFlow<PluginLocalization>
8+
9+
public fun <T : PluginLocalization> register(instance: T): Boolean
10+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.codee.app.plugins.api.files
2+
3+
public sealed interface DirectoryStorageElement : StorageElement {
4+
/**
5+
* Gets [StorageElement] at current path + [name].
6+
* @return [StorageElement].
7+
*/
8+
public operator fun get(name: String): StorageElement
9+
10+
/**
11+
* Root directory that cannot go back.
12+
*/
13+
public interface RootDirectoryStorageElement : DirectoryStorageElement
14+
15+
/**
16+
* Root directory that cannot go back.
17+
*/
18+
public interface ChildDirectoryStorageElement : DirectoryStorageElement {
19+
public val parent: DirectoryStorageElement
20+
21+
/**
22+
* Removes directory at current path.
23+
*/
24+
public suspend fun delete()
25+
}
26+
}
27+
28+
public fun DirectoryStorageElement.getDirectoryOrNull(name: String): DirectoryStorageElement? =
29+
this[name] as? DirectoryStorageElement
30+
31+
public fun DirectoryStorageElement.getFileOrNull(name: String): StorageElement? =
32+
this[name].takeIf { it is FileStorageElement }

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /