Filter.kt 3.37 KB
Newer Older
Jonas Waeber's avatar
Jonas Waeber committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * search-doc-service
 * Copyright (C) 2020 Memoriav
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package org.memobase.helpers

Jonas Waeber's avatar
Jonas Waeber committed
21
import ch.memobase.rdf.EBUCORE
Jonas Waeber's avatar
Jonas Waeber committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
import com.beust.klaxon.JsonArray
import com.beust.klaxon.JsonObject
import org.apache.logging.log4j.LogManager

object Filter {
    private val log = LogManager.getLogger("SearchDocFilter")

    /**
     *
     *
     * @param sourceProperty
     * @param sourceResource
     * @param fullGraph
     * @return The list of de-referenced JSON Objects.
     */
Jonas Waeber's avatar
Jonas Waeber committed
37 38 39 40 41
    fun entitiesByProperty(
        sourceProperty: String,
        sourceResource: JsonObject?,
        fullGraph: Map<String, JsonObject>
    ): List<JsonObject> {
Jonas Waeber's avatar
Jonas Waeber committed
42 43 44 45 46 47
        if (sourceResource == null) {
            log.info("No results collected from property $sourceProperty, because resource does not exist.")
            return emptyList()
        }
        return sourceResource[sourceProperty].let {
            when (it) {
Jonas Waeber's avatar
Jonas Waeber committed
48 49 50 51 52 53 54 55 56
                is String ->
                    when (val newValue = fullGraph[it]) {
                        is JsonObject -> listOf(newValue)
                        else -> {
                            log.error("Could not extract json-object from entity $it in property $sourceProperty.")
                            emptyList()
                        }
                    }
                is JsonObject ->
Jonas Waeber's avatar
Jonas Waeber committed
57
                    when (val newValue = fullGraph[it[KEYS.entityId]]) {
Jonas Waeber's avatar
Jonas Waeber committed
58 59 60 61 62 63
                        is JsonObject -> listOf(newValue)
                        else -> {
                            log.error("Could not extract json-object from entity $it in property $sourceProperty.")
                            emptyList()
                        }
                    }
Jonas Waeber's avatar
Jonas Waeber committed
64 65 66 67
                is JsonArray<*> ->
                    it.mapNotNull { child ->
                        when (child) {
                            is String -> fullGraph[child]
Jonas Waeber's avatar
Jonas Waeber committed
68
                            is JsonObject -> fullGraph[child[KEYS.entityId]]
Jonas Waeber's avatar
Jonas Waeber committed
69 70 71 72
                            else -> null
                        }
                    }
                null -> {
Jonas Waeber's avatar
Jonas Waeber committed
73
                    log.info("Property $sourceProperty is not defined in resource ${sourceResource[KEYS.entityId]}.")
Jonas Waeber's avatar
Jonas Waeber committed
74 75 76
                    emptyList()
                }
                else -> {
Jonas Waeber's avatar
Jonas Waeber committed
77
                    log.error("Unexpected JSON structure for property $sourceProperty in resource ${sourceResource[KEYS.entityId]}.")
Jonas Waeber's avatar
Jonas Waeber committed
78 79 80 81 82
                    emptyList()
                }
            }
        }
    }
Jonas Waeber's avatar
Jonas Waeber committed
83

Jonas Waeber's avatar
Jonas Waeber committed
84 85
    fun checkLocator(digitalObject: JsonObject?): Boolean {
        return digitalObject?.containsKey(EBUCORE.locator.localName) ?: false
Jonas Waeber's avatar
Jonas Waeber committed
86
    }
Jonas Waeber's avatar
Jonas Waeber committed
87 88 89 90

    fun checkSftpPrefix(digitalObject: JsonObject): Boolean {
        return (digitalObject[EBUCORE.locator.localName] as String).startsWith("sftp:")
    }
Jonas Waeber's avatar
Jonas Waeber committed
91
}