diff --git a/commons/config/src/main/scala/net/shrine/config/AtomicConfigSource.scala b/commons/config/src/main/scala/net/shrine/config/AtomicConfigSource.scala index 67956ea27..bed19b096 100644 --- a/commons/config/src/main/scala/net/shrine/config/AtomicConfigSource.scala +++ b/commons/config/src/main/scala/net/shrine/config/AtomicConfigSource.scala @@ -1,52 +1,59 @@ package net.shrine.config import java.util.concurrent.atomic.AtomicReference import com.typesafe.config.{ConfigFactory, Config} import scala.util.{Failure, Success, Try} /** * Use to inject a new config without clearing and reloading a new config (for testing). * * @author david * @since 4/29/15 */ class AtomicConfigSource(baseConfig:Config) { val atomicConfigRef = new AtomicReference[Config](ConfigFactory.empty()) /** * Get the Atomic Config. Be sure to use defs for all config values that might be changed. */ def config:Config = { atomicConfigRef.get().withFallback(baseConfig) } def configForBlock[T](key:String,value:AnyRef,origin:String)(block: => T):T = { val configPairs = Map(key -> value) configForBlock(configPairs,origin)(block) } def configForBlock[T](configPairs:Map[String, _ <: AnyRef],origin:String)(block: => T):T = { import scala.collection.JavaConverters.mapAsJavaMapConverter val configPairsJava:java.util.Map[String, _ <: AnyRef] = configPairs.asJava val blockConfig:Config = ConfigFactory.parseMap(configPairsJava,origin) - val originalConfig:Config = atomicConfigRef.getAndSet(blockConfig) + + configForBlock(blockConfig,origin)(block) + } + + def configForBlock[T](config:Config,origin:String)(block: => T):T = { + + val originalConfig:Config = atomicConfigRef.getAndSet(config) val tryT:Try[T] = Try(block) - val ok = atomicConfigRef.compareAndSet(blockConfig,originalConfig) + val ok = atomicConfigRef.compareAndSet(config,originalConfig) tryT match { case Success(t) => { if(ok) t - else throw new IllegalStateException(s"Expected config from ${blockConfig.origin()} to be from ${atomicConfigRef.get().origin()} instead.") + else throw new IllegalStateException(s"Expected config from ${config.origin()} to be from ${atomicConfigRef.get().origin()} instead.") } case Failure(x) => { if(ok) throw x - else throw new IllegalStateException(s"Throwable in block and expected config from ${blockConfig.origin()} to be from ${atomicConfigRef.get().origin()} instead.",x) + else throw new IllegalStateException(s"Throwable in block and expected config from ${config.origin()} to be from ${atomicConfigRef.get().origin()} instead.",x) } } } + } diff --git a/qep/service/src/main/scala/net/shrine/qep/QepConfigSource.scala b/qep/service/src/main/scala/net/shrine/qep/QepConfigSource.scala index 9d4789fdd..2f3b02d60 100644 --- a/qep/service/src/main/scala/net/shrine/qep/QepConfigSource.scala +++ b/qep/service/src/main/scala/net/shrine/qep/QepConfigSource.scala @@ -1,39 +1,43 @@ package net.shrine.qep import com.typesafe.config.{Config, ConfigFactory} import net.shrine.config.AtomicConfigSource import net.shrine.log.Log /** * Source of config for the Qep. Put new config fields here, not in QepConfig, to enable Config-based apply() methods. * * @author david * @since 8/18/15 */ object QepConfigSource { val atomicConfig = new AtomicConfigSource(ConfigFactory.load("shrine")) def config:Config = { atomicConfig.config } Log.debug(s"shrine.queryEntryPoint.audit.collectQepAudit is ${config.getBoolean("shrine.queryEntryPoint.audit.collectQepAudit")}") def configForBlock[T](key:String,value:AnyRef,origin:String)(block: => T):T = { atomicConfig.configForBlock(key,value,origin)(block) } -//todo move this to common code somewhere + def configForBlock[T](config:Config,origin:String)(block: => T):T = { + atomicConfig.configForBlock(config,origin)(block) + } + + //todo move this to common code somewhere def objectForName[T](objectName:String):T = { import scala.reflect.runtime.universe val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader) val module = runtimeMirror.staticModule(objectName) val reflectedObj = runtimeMirror.reflectModule(module) val obj = reflectedObj.instance obj.asInstanceOf[T] } } \ No newline at end of file diff --git a/tools/adapter-queries-to-qep/src/main/scala/net/shrine/utilities/adapterqueriestoqep/AdapterQueriesToQep.scala b/tools/adapter-queries-to-qep/src/main/scala/net/shrine/utilities/adapterqueriestoqep/AdapterQueriesToQep.scala index 789f3e7c3..dfcd07318 100644 --- a/tools/adapter-queries-to-qep/src/main/scala/net/shrine/utilities/adapterqueriestoqep/AdapterQueriesToQep.scala +++ b/tools/adapter-queries-to-qep/src/main/scala/net/shrine/utilities/adapterqueriestoqep/AdapterQueriesToQep.scala @@ -1,86 +1,91 @@ package net.shrine.utilities.adapterqueriestoqep import java.io.File import javax.sql.DataSource import javax.xml.datatype.XMLGregorianCalendar import com.typesafe.config.{Config, ConfigFactory} import net.shrine.adapter.dao.AdapterDao import net.shrine.adapter.dao.model.ShrineQuery import net.shrine.adapter.dao.squeryl.SquerylAdapterDao import net.shrine.dao.squeryl.{DataSourceSquerylInitializer, SquerylInitializer, SquerylDbAdapterSelecter} import net.shrine.adapter.dao.squeryl.tables.{Tables => AdapterTables} import net.shrine.protocol.ResultOutputTypes +import net.shrine.qep.QepConfigSource import net.shrine.qep.queries.{QepQueryDb, QepQuery, QepQueryFlag} import net.shrine.slick.TestableDataSourceCreator import org.squeryl.internals.DatabaseAdapter import net.shrine.config.ConfigExtensions /** * @author dwalend * @since 1.21 */ object AdapterQueriesToQep { def main(args: Array[String]): Unit = { if(args.length < 3) throw new IllegalArgumentException("Requires three arguments: the domain to transfer, the full path to the adapter-queries-to-qep.conf file, and the full path to the shrine.conf file.") val domain = args(0) val localConfig = args(1) val shrineConfig = args(2) val config: Config = ConfigFactory.parseFile(new File(localConfig)).withFallback(ConfigFactory.parseFile(new File(shrineConfig))).withFallback(ConfigFactory.load()) +// println(config) + val adapterDataSource: DataSource = TestableDataSourceCreator.dataSource(config.getConfig("shrine.adapter.query.database")) val squerylAdapter: DatabaseAdapter = SquerylDbAdapterSelecter.determineAdapter(config.getString("shrine.shrineDatabaseType")) val squerylInitializer: SquerylInitializer = new DataSourceSquerylInitializer(adapterDataSource, squerylAdapter) val squerylAdapterTables: AdapterTables = new AdapterTables val breakdownTypes = config.getOptionConfigured("breakdownResultOutputTypes",ResultOutputTypes.fromConfig).getOrElse(Set.empty) val adapterDao: AdapterDao = new SquerylAdapterDao(squerylInitializer, squerylAdapterTables)(breakdownTypes) val adapterQueries: Seq[ShrineQuery] = adapterDao.findQueriesByDomain(domain) - println(s"Found ${adapterQueries.mkString(",\n")}") +// println(s"Found ${adapterQueries.mkString(",\n")}") - //todo filter out any queries that already exist + QepConfigSource.configForBlock(config,getClass.getSimpleName) { - //turn each ShrineQuery into a QepQuery and store it - adapterQueries.map(shrineQueryToQepQuery).foreach(QepQueryDb.db.insertQepQuery) + //turn each ShrineQuery into a QepQuery and store it + //todo filter out any queries that already exist + adapterQueries.map(shrineQueryToQepQuery).foreach(QepQueryDb.db.insertQepQuery) - //todo only carry over flags for queries that don't already have flag entries + //todo only carry over flags for queries that don't already have flag entries - //make flags for each ShrineQuery and store that - adapterQueries.flatMap(shrineQueryToQepQueryFlag).foreach(QepQueryDb.db.insertQepQueryFlag) + //make flags for each ShrineQuery and store that + adapterQueries.flatMap(shrineQueryToQepQueryFlag).foreach(QepQueryDb.db.insertQepQueryFlag) + } } def shrineQueryToQepQuery(shrineQuery: ShrineQuery):QepQuery = { val date:Long = toMillis(shrineQuery.dateCreated) new QepQuery( networkId = shrineQuery.networkId, userName = shrineQuery.username, userDomain = shrineQuery.domain, queryName = shrineQuery.name, expression = shrineQuery.queryDefinition.expr.fold("")(expression => expression.toXml.text), dateCreated = date, deleted = false, queryXml = shrineQuery.queryDefinition.toXml.text, changeDate = date ) } def shrineQueryToQepQueryFlag(shrineQuery: ShrineQuery):Option[QepQueryFlag] = { if(shrineQuery.isFlagged){ Some(new QepQueryFlag( networkQueryId = shrineQuery.networkId, flagged = shrineQuery.isFlagged, flagMessage = shrineQuery.flagMessage.getOrElse(""), changeDate = toMillis(shrineQuery.dateCreated) )) } else None } private def toMillis(xmlGc: XMLGregorianCalendar): Long = xmlGc.toGregorianCalendar.getTimeInMillis } \ No newline at end of file