1
0
forked from SPC/spc-site

[WIP] refactor in progress

This commit is contained in:
Alexander Nozik 2024-01-19 22:25:23 +03:00
parent f65b537255
commit 72ac07db5a
2 changed files with 70 additions and 52 deletions

View File

@ -3,7 +3,6 @@ package center.sciprog
import io.ktor.server.application.Application import io.ktor.server.application.Application
import io.ktor.server.application.call import io.ktor.server.application.call
import io.ktor.server.application.install import io.ktor.server.application.install
import io.ktor.server.application.log
import io.ktor.server.config.tryGetString import io.ktor.server.config.tryGetString
import io.ktor.server.plugins.forwardedheaders.ForwardedHeaders import io.ktor.server.plugins.forwardedheaders.ForwardedHeaders
import io.ktor.server.plugins.forwardedheaders.XForwardedHeaders import io.ktor.server.plugins.forwardedheaders.XForwardedHeaders
@ -12,53 +11,67 @@ import io.ktor.server.routing.get
import io.ktor.server.routing.routing import io.ktor.server.routing.routing
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.request import space.kscience.dataforge.context.request
import space.kscience.dataforge.data.DataTree import space.kscience.dataforge.data.DataSourceBuilder
import space.kscience.dataforge.workspace.readDataDirectory import space.kscience.dataforge.io.IOPlugin
import space.kscience.snark.html.* import space.kscience.dataforge.misc.DFExperimental
import space.kscience.snark.ktor.prepareSnarkDataCacheDirectory import space.kscience.dataforge.names.Name
import space.kscience.dataforge.workspace.monitorRawDirectory
import space.kscience.dataforge.workspace.readResources
import space.kscience.snark.html.SnarkHtml
import space.kscience.snark.html.fill
import space.kscience.snark.html.readSiteData
import space.kscience.snark.ktor.site import space.kscience.snark.ktor.site
import java.nio.file.FileSystems
import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import kotlin.io.path.createDirectories
import kotlin.io.path.isRegularFile
import kotlin.io.path.relativeTo
import kotlin.io.path.toPath
private fun Application.copyResource(resource: String, dataDirectory: Path) { //private fun Application.copyResource(resource: String, dataDirectory: Path) {
val uri = javaClass.getResource("/$resource")?.toURI() // val uri = javaClass.getResource("/$resource")?.toURI()
?: error("Resource $resource not found") // ?: error("Resource $resource not found")
val targetPath = dataDirectory.resolve(resource) // val targetPath = dataDirectory.resolve(resource)
//
// if (Files.isDirectory(targetPath)) {
// log.info("Using existing data directory at $targetPath.")
// } else {
// log.info("Copying data from $uri into $targetPath.")
// targetPath.createDirectories()
// //Copy everything into a temporary directory
//
// fun copyFromPath(rootPath: Path) {
// Files.walk(rootPath).forEach { source: Path ->
// if (source.isRegularFile()) {
// val relative = source.relativeTo(rootPath).toString()
// val destination: Path = targetPath.resolve(relative)
// destination.parent.createDirectories()
// Files.copy(source, destination)
// }
// }
// }
//
// if ("jar" == uri.scheme) {
// FileSystems.newFileSystem(uri, emptyMap<String, Any>()).use { fs ->
// val rootPath: Path = fs.provider().getPath(uri)
// copyFromPath(rootPath)
// }
// } else {
// val rootPath = uri.toPath()
// copyFromPath(rootPath)
// }
// }
//}
if (Files.isDirectory(targetPath)) { context(IOPlugin)
log.info("Using existing data directory at $targetPath.") @OptIn(DFExperimental::class)
} else { fun DataSourceBuilder<Any>.directory(path: Path, name: Name = Name.EMPTY) {
log.info("Copying data from $uri into $targetPath.") node(name, monitorRawDirectory(path))
targetPath.createDirectories() }
//Copy everything into a temporary directory
fun copyFromPath(rootPath: Path) { context(IOPlugin)
Files.walk(rootPath).forEach { source: Path -> @OptIn(DFExperimental::class)
if (source.isRegularFile()) { fun DataSourceBuilder<Any>.resource(
val relative = source.relativeTo(rootPath).toString() resource: String,
val destination: Path = targetPath.resolve(relative) classLoader: ClassLoader = Thread.currentThread().contextClassLoader,
destination.parent.createDirectories() ) {
Files.copy(source, destination) fill(readResources(resource, classLoader = classLoader))
}
}
}
if ("jar" == uri.scheme) {
FileSystems.newFileSystem(uri, emptyMap<String, Any>()).use { fs ->
val rootPath: Path = fs.provider().getPath(uri)
copyFromPath(rootPath)
}
} else {
val rootPath = uri.toPath()
copyFromPath(rootPath)
}
}
} }
@ -78,14 +91,13 @@ fun Application.spcModule() {
environment.config.tryGetString("ktor.environment.dataDirectory") ?: "data" environment.config.tryGetString("ktor.environment.dataDirectory") ?: "data"
) )
if (!prepareSnarkDataCacheDirectory(dataDirectory)) { val siteData = snark.readSiteData(context) {
copyResource("common", dataDirectory) resource("common")
copyResource("home", dataDirectory) resource("home")
copyResource("magprog", dataDirectory) resource("magprog")
//directory(dataDirectory)
} }
val siteData: DataTree<Any> = snark.io.readDataDirectory(dataDirectory)
routing { routing {
get("magprog") { get("magprog") {
call.respondRedirect("education/masters") call.respondRedirect("education/masters")

View File

@ -3,19 +3,25 @@ package center.sciprog
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.Context
import space.kscience.dataforge.context.request import space.kscience.dataforge.context.request
import space.kscience.snark.html.* import space.kscience.snark.html.SnarkHtml
import space.kscience.snark.html.readSiteData
import space.kscience.snark.html.static.staticSite import space.kscience.snark.html.static.staticSite
import java.nio.file.Path import java.nio.file.Path
suspend fun main(args: Array<String>) = coroutineScope{ suspend fun main(args: Array<String>) = coroutineScope {
val context = Context{ val context = Context {
plugin(SnarkHtml) plugin(SnarkHtml)
} }
val destinationPath = args.firstOrNull() ?: "build/public" val destinationPath = args.firstOrNull() ?: "build/public"
val snark = context.request(SnarkHtml) val snark = context.request(SnarkHtml)
val siteData = snark.readResources("common", "home", "magprog") val siteData = snark.readSiteData(context) {
resource("common")
resource("home")
resource("magprog")
}
snark.staticSite(siteData, Path.of(destinationPath), content = spcSite) snark.staticSite(siteData, Path.of(destinationPath), content = spcSite)
} }