1 /***********************************************************************
2  * Copyright (c) 2013-2024 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.fs.storage.converter
10 
11 import com.typesafe.scalalogging.LazyLogging
12 import org.locationtech.geomesa.fs.storage.api._
13 import org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory._
14 import org.locationtech.geomesa.utils.geotools.{SftArgResolver, SftArgs}
15 
16 import java.util.regex.Pattern
17 
18 class ConverterMetadataFactory extends StorageMetadataFactory with LazyLogging {
19 
20   import scala.collection.JavaConverters._
21 
22   override def name: String = ConverterStorage.Encoding
23 
24   override def load(context: FileSystemContext): Option[StorageMetadata] = {
25     if (!Option(context.conf.get(ConverterPathParam)).contains(context.root.getName)) { None } else {
26       try {
27         val sft = {
28           val sftArg = Option(context.conf.get(SftConfigParam))
29               .orElse(Option(context.conf.get(SftNameParam)))
30               .getOrElse(throw new IllegalArgumentException(s"Must provide either simple feature type config or name"))
31           SftArgResolver.getArg(SftArgs(sftArg, null)) match {
32             case Left(e) => throw new IllegalArgumentException("Could not load SimpleFeatureType with provided parameters", e)
33             case Right(schema) => schema
34           }
35         }
36 
37         val partitionSchemeOpts =
38           context.conf.getValByRegex(Pattern.quote(PartitionOptsPrefix) + ".*").asScala.map {
39             case (k, v) => k.substring(PartitionOptsPrefix.length) -> v
40           }
41 
42         val scheme = {
43           val partitionSchemeName =
44             Option(context.conf.get(PartitionSchemeParam))
45                 .getOrElse(throw new IllegalArgumentException(s"Must provide partition scheme name"))
46           PartitionSchemeFactory.load(sft, NamedOptions(partitionSchemeName, partitionSchemeOpts.toMap))
47         }
48 
49         val leafStorage = Option(context.conf.get(LeafStorageParam)).map(_.toBoolean).getOrElse {
50           val deprecated = partitionSchemeOpts.get("leaf-storage").map { s =>
51             logger.warn("Using deprecated leaf-storage partition-scheme option. Please define leaf-storage using " +
52                 s"'$LeafStorageParam'")
53             s.toBoolean
54           }
55           deprecated.getOrElse(true)
56         }
57 
58         Some(new ConverterMetadata(context, sft, scheme, leafStorage))
59       } catch {
60         case e: IllegalArgumentException => logger.warn(s"Couldn't create converter storage metadata: $e", e); None
61       }
62     }
63   }
64 
65   override def create(context: FileSystemContext, config: Map[String, String], meta: Metadata): StorageMetadata =
66     throw new NotImplementedError("Converter storage is read only")
67 }
Line Stmt Id Pos Tree Symbol Tests Code
22 158 955 - 980 Select org.locationtech.geomesa.fs.storage.converter.ConverterStorage.Encoding ConverterStorage.Encoding
25 159 1092 - 1110 Select org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.ConverterPathParam org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.ConverterPathParam
25 160 1075 - 1111 Apply org.apache.hadoop.conf.Configuration.get context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.ConverterPathParam)
25 161 1122 - 1142 Apply org.apache.hadoop.fs.Path.getName context.root.getName()
25 162 1067 - 1143 Select scala.Boolean.unary_! scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.ConverterPathParam)).contains[String](context.root.getName()).unary_!
25 163 1147 - 1151 Select scala.None scala.None
25 164 1147 - 1151 Block scala.None scala.None
26 201 1181 - 2729 Block <nosymbol> { val sft: org.geotools.api.feature.simple.SimpleFeatureType = { val sftArg: String = scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftConfigParam)).orElse[String](scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam))).getOrElse[String](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide either simple feature type config or name").s())); org.locationtech.geomesa.utils.geotools.SftArgResolver.getArg(org.locationtech.geomesa.utils.geotools.SftArgs.apply(sftArg, null)) match { case (value: Throwable)scala.util.Left[Throwable,org.geotools.api.feature.simple.SimpleFeatureType]((e @ _)) => throw new scala.`package`.IllegalArgumentException("Could not load SimpleFeatureType with provided parameters", e) case (value: org.geotools.api.feature.simple.SimpleFeatureType)scala.util.Right[Throwable,org.geotools.api.feature.simple.SimpleFeatureType]((schema @ _)) => schema } }; val partitionSchemeOpts: scala.collection.mutable.Map[String,String] = scala.collection.JavaConverters.mapAsScalaMapConverter[String, String](context.conf.getValByRegex(java.util.regex.Pattern.quote(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix).+(".*"))).asScala.map[(String, String), scala.collection.mutable.Map[String,String]](((x0$1: (String, String)) => x0$1 match { case (_1: String, _2: String)(String, String)((k @ _), (v @ _)) => scala.Predef.ArrowAssoc[String](k.substring(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix.length())).->[String](v) }))(mutable.this.Map.canBuildFrom[String, String]); val scheme: org.locationtech.geomesa.fs.storage.api.PartitionScheme = { val partitionSchemeName: String = scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionSchemeParam)).getOrElse[String](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide partition scheme name").s())); org.locationtech.geomesa.fs.storage.api.PartitionSchemeFactory.load(sft, org.locationtech.geomesa.fs.storage.api.`package`.NamedOptions.apply(partitionSchemeName, partitionSchemeOpts.toMap[String, String](scala.Predef.$conforms[(String, String)]))) }; val leafStorage: Boolean = scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam)).map[Boolean](((x$1: String) => scala.Predef.augmentString(x$1).toBoolean)).getOrElse[Boolean]({ val deprecated: Option[Boolean] = partitionSchemeOpts.get("leaf-storage").map[Boolean](((s: String) => { (if (ConverterMetadataFactory.this.logger.underlying.isWarnEnabled()) ConverterMetadataFactory.this.logger.underlying.warn("Using deprecated leaf-storage partition-scheme option. Please define leaf-storage using ".+(scala.StringContext.apply("\'", "\'").s(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam))) else (): Unit); scala.Predef.augmentString(s).toBoolean })); deprecated.getOrElse[Boolean](true) }); scala.Some.apply[org.locationtech.geomesa.fs.storage.converter.ConverterMetadata](new ConverterMetadata(context, sft, scheme, leafStorage)) }
26 204 1167 - 2869 Try <nosymbol> try { val sft: org.geotools.api.feature.simple.SimpleFeatureType = { val sftArg: String = scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftConfigParam)).orElse[String](scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam))).getOrElse[String](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide either simple feature type config or name").s())); org.locationtech.geomesa.utils.geotools.SftArgResolver.getArg(org.locationtech.geomesa.utils.geotools.SftArgs.apply(sftArg, null)) match { case (value: Throwable)scala.util.Left[Throwable,org.geotools.api.feature.simple.SimpleFeatureType]((e @ _)) => throw new scala.`package`.IllegalArgumentException("Could not load SimpleFeatureType with provided parameters", e) case (value: org.geotools.api.feature.simple.SimpleFeatureType)scala.util.Right[Throwable,org.geotools.api.feature.simple.SimpleFeatureType]((schema @ _)) => schema } }; val partitionSchemeOpts: scala.collection.mutable.Map[String,String] = scala.collection.JavaConverters.mapAsScalaMapConverter[String, String](context.conf.getValByRegex(java.util.regex.Pattern.quote(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix).+(".*"))).asScala.map[(String, String), scala.collection.mutable.Map[String,String]](((x0$1: (String, String)) => x0$1 match { case (_1: String, _2: String)(String, String)((k @ _), (v @ _)) => scala.Predef.ArrowAssoc[String](k.substring(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix.length())).->[String](v) }))(mutable.this.Map.canBuildFrom[String, String]); val scheme: org.locationtech.geomesa.fs.storage.api.PartitionScheme = { val partitionSchemeName: String = scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionSchemeParam)).getOrElse[String](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide partition scheme name").s())); org.locationtech.geomesa.fs.storage.api.PartitionSchemeFactory.load(sft, org.locationtech.geomesa.fs.storage.api.`package`.NamedOptions.apply(partitionSchemeName, partitionSchemeOpts.toMap[String, String](scala.Predef.$conforms[(String, String)]))) }; val leafStorage: Boolean = scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam)).map[Boolean](((x$1: String) => scala.Predef.augmentString(x$1).toBoolean)).getOrElse[Boolean]({ val deprecated: Option[Boolean] = partitionSchemeOpts.get("leaf-storage").map[Boolean](((s: String) => { (if (ConverterMetadataFactory.this.logger.underlying.isWarnEnabled()) ConverterMetadataFactory.this.logger.underlying.warn("Using deprecated leaf-storage partition-scheme option. Please define leaf-storage using ".+(scala.StringContext.apply("\'", "\'").s(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam))) else (): Unit); scala.Predef.augmentString(s).toBoolean })); deprecated.getOrElse[Boolean](true) }); scala.Some.apply[org.locationtech.geomesa.fs.storage.converter.ConverterMetadata](new ConverterMetadata(context, sft, scheme, leafStorage)) } catch { case (e @ (_: IllegalArgumentException)) => { (if (ConverterMetadataFactory.this.logger.underlying.isWarnEnabled()) ConverterMetadataFactory.this.logger.underlying.warn(scala.StringContext.apply("Couldn\'t create converter storage metadata: ", "").s(e), e) else (): Unit); scala.None } }
28 165 1240 - 1254 Select org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftConfigParam org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftConfigParam
28 166 1223 - 1255 Apply org.apache.hadoop.conf.Configuration.get context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftConfigParam)
29 167 1303 - 1315 Select org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam
29 168 1286 - 1316 Apply org.apache.hadoop.conf.Configuration.get context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam)
29 169 1279 - 1317 Apply scala.Option.apply scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam))
30 170 1344 - 1437 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide either simple feature type config or name").s())
30 171 1216 - 1438 Apply scala.Option.getOrElse scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftConfigParam)).orElse[String](scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.SftNameParam))).getOrElse[String](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide either simple feature type config or name").s()))
31 172 1471 - 1492 Apply org.locationtech.geomesa.utils.geotools.SftArgs.apply org.locationtech.geomesa.utils.geotools.SftArgs.apply(sftArg, null)
31 173 1449 - 1493 Apply org.locationtech.geomesa.utils.conf.ArgResolver.getArg org.locationtech.geomesa.utils.geotools.SftArgResolver.getArg(org.locationtech.geomesa.utils.geotools.SftArgs.apply(sftArg, null))
32 174 1530 - 1628 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException("Could not load SimpleFeatureType with provided parameters", e)
32 175 1530 - 1628 Block <nosymbol> throw new scala.`package`.IllegalArgumentException("Could not load SimpleFeatureType with provided parameters", e)
33 176 1663 - 1669 Ident org.locationtech.geomesa.fs.storage.converter.ConverterMetadataFactory.schema schema
38 177 1764 - 1805 Apply java.lang.String.+ java.util.regex.Pattern.quote(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix).+(".*")
38 178 1737 - 1806 Apply org.apache.hadoop.conf.Configuration.getValByRegex context.conf.getValByRegex(java.util.regex.Pattern.quote(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix).+(".*"))
38 181 1819 - 1819 TypeApply scala.collection.mutable.Map.canBuildFrom mutable.this.Map.canBuildFrom[String, String]
38 182 1737 - 1904 ApplyToImplicitArgs scala.collection.TraversableLike.map scala.collection.JavaConverters.mapAsScalaMapConverter[String, String](context.conf.getValByRegex(java.util.regex.Pattern.quote(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix).+(".*"))).asScala.map[(String, String), scala.collection.mutable.Map[String,String]](((x0$1: (String, String)) => x0$1 match { case (_1: String, _2: String)(String, String)((k @ _), (v @ _)) => scala.Predef.ArrowAssoc[String](k.substring(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix.length())).->[String](v) }))(mutable.this.Map.canBuildFrom[String, String])
39 179 1848 - 1892 Apply scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String](k.substring(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix.length())).->[String](v)
39 180 1848 - 1892 Block scala.Predef.ArrowAssoc.-> scala.Predef.ArrowAssoc[String](k.substring(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionOptsPrefix.length())).->[String](v)
44 183 2001 - 2021 Select org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionSchemeParam org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionSchemeParam
44 184 1984 - 2022 Apply org.apache.hadoop.conf.Configuration.get context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionSchemeParam)
45 185 2051 - 2124 Throw <nosymbol> throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide partition scheme name").s())
45 186 1977 - 2125 Apply scala.Option.getOrElse scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.PartitionSchemeParam)).getOrElse[String](throw new scala.`package`.IllegalArgumentException(scala.StringContext.apply("Must provide partition scheme name").s()))
46 187 2223 - 2223 TypeApply scala.Predef.$conforms scala.Predef.$conforms[(String, String)]
46 188 2203 - 2228 ApplyToImplicitArgs scala.collection.TraversableOnce.toMap partitionSchemeOpts.toMap[String, String](scala.Predef.$conforms[(String, String)])
46 189 2169 - 2229 Apply org.locationtech.geomesa.fs.storage.api.NamedOptions.apply org.locationtech.geomesa.fs.storage.api.`package`.NamedOptions.apply(partitionSchemeName, partitionSchemeOpts.toMap[String, String](scala.Predef.$conforms[(String, String)]))
46 190 2136 - 2230 Apply org.locationtech.geomesa.fs.storage.api.PartitionSchemeFactory.load org.locationtech.geomesa.fs.storage.api.PartitionSchemeFactory.load(sft, org.locationtech.geomesa.fs.storage.api.`package`.NamedOptions.apply(partitionSchemeName, partitionSchemeOpts.toMap[String, String](scala.Predef.$conforms[(String, String)])))
49 191 2292 - 2308 Select org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam
49 192 2275 - 2309 Apply org.apache.hadoop.conf.Configuration.get context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam)
49 193 2315 - 2326 Select scala.collection.immutable.StringLike.toBoolean scala.Predef.augmentString(x$1).toBoolean
49 198 2268 - 2657 Apply scala.Option.getOrElse scala.Option.apply[String](context.conf.get(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam)).map[Boolean](((x$1: String) => scala.Predef.augmentString(x$1).toBoolean)).getOrElse[Boolean]({ val deprecated: Option[Boolean] = partitionSchemeOpts.get("leaf-storage").map[Boolean](((s: String) => { (if (ConverterMetadataFactory.this.logger.underlying.isWarnEnabled()) ConverterMetadataFactory.this.logger.underlying.warn("Using deprecated leaf-storage partition-scheme option. Please define leaf-storage using ".+(scala.StringContext.apply("\'", "\'").s(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam))) else (): Unit); scala.Predef.augmentString(s).toBoolean })); deprecated.getOrElse[Boolean](true) })
50 194 2391 - 2405 Literal <nosymbol> "leaf-storage"
50 196 2367 - 2610 Apply scala.Option.map partitionSchemeOpts.get("leaf-storage").map[Boolean](((s: String) => { (if (ConverterMetadataFactory.this.logger.underlying.isWarnEnabled()) ConverterMetadataFactory.this.logger.underlying.warn("Using deprecated leaf-storage partition-scheme option. Please define leaf-storage using ".+(scala.StringContext.apply("\'", "\'").s(org.locationtech.geomesa.fs.storage.converter.ConverterStorageFactory.LeafStorageParam))) else (): Unit); scala.Predef.augmentString(s).toBoolean }))
53 195 2587 - 2598 Select scala.collection.immutable.StringLike.toBoolean scala.Predef.augmentString(s).toBoolean
55 197 2621 - 2647 Apply scala.Option.getOrElse deprecated.getOrElse[Boolean](true)
58 199 2672 - 2728 Apply org.locationtech.geomesa.fs.storage.converter.ConverterMetadata.<init> new ConverterMetadata(context, sft, scheme, leafStorage)
58 200 2667 - 2729 Apply scala.Some.apply scala.Some.apply[org.locationtech.geomesa.fs.storage.converter.ConverterMetadata](new ConverterMetadata(context, sft, scheme, leafStorage))
60 202 2857 - 2861 Select scala.None scala.None
60 203 2787 - 2861 Block <nosymbol> { (if (ConverterMetadataFactory.this.logger.underlying.isWarnEnabled()) ConverterMetadataFactory.this.logger.underlying.warn(scala.StringContext.apply("Couldn\'t create converter storage metadata: ", "").s(e), e) else (): Unit); scala.None }
66 205 2999 - 3062 Throw <nosymbol> throw new scala.NotImplementedError("Converter storage is read only")