app/helpers/UserInfoBuilder.scala (66 lines of code) (raw):

package helpers import java.io.File import com.om.mxs.client.japi.UserInfo import org.slf4j.LoggerFactory import scala.io.Source import scala.util.{Failure, Success, Try} case class UserInfoBuilder(cluster:Option[String],user:Option[String], password:Option[String],vault:Option[String],addresses:Option[String],vaultName:Option[String], protocol:Option[String],clusterPassword:Option[String],descriptiveLabel:Option[String]) { val whitespace = "\\s+".r def withCluster(clusterName:String) = this.copy(cluster=Some(clusterName)) def withUser(value:String) = this.copy(user=Some(value)) def withPassword(value:String) = this.copy(password=Some(value)) def withVault(value:String) = this.copy(vault=Some(value)) def withAddresses(value:String) = this.copy(addresses=Some(whitespace.replaceAllIn(value,""))) def withVaultName(value:String) = this.copy(vaultName=Some(value)) def withProtocol(value:String) = this.copy(protocol=Some(value)) def withClusterPassword(value:String) = this.copy(clusterPassword=Some(value)) def withDescriptiveLabel(value:String) = this.copy(descriptiveLabel=Some(value)) def getUserInfo:Try[UserInfo] = Try { new UserInfo(addresses.get, cluster.get, vault.get, user.get, password.get) } } object UserInfoBuilder { private val logger = LoggerFactory.getLogger(getClass) def apply(cluster: Option[String], user: Option[String], password: Option[String], vault: Option[String], addresses: Option[String], vaultName: Option[String], protocol: Option[String], cluster_password: Option[String],descriptiveLabel:Option[String]): UserInfoBuilder = new UserInfoBuilder(cluster, user, password, vault, addresses, vaultName, protocol, cluster_password, descriptiveLabel) def apply() = new UserInfoBuilder(None,None,None,None,None,None,None,None,None) private val commentRE = "^#".r private val splitterRE = "^([^=]+)=(.*)$".r def fromPath(filePath:String) = fromFile(new File(filePath)) def builderFromFile(file:File) = { val src = Source.fromFile(file.getAbsolutePath) var builder:UserInfoBuilder = UserInfoBuilder() logger.info(s"Loading ${file.getAbsolutePath}") try { for (line <- src.getLines()) { line match { case commentRE(_) => case splitterRE(key, value) => logger.debug(s"Got key '$key' with value '$value'") key match { case "cluster" => builder = builder.withCluster(value) case "user" => builder = builder.withUser(value) case "password" => builder = builder.withPassword(value) case "vault" => builder = builder.withVault(value) case "addresses" => builder = builder.withAddresses(value) case "vaultName" => builder = builder.withVaultName(value) case "protocol" => builder = builder.withProtocol(value) case "cluster password" => builder = builder.withClusterPassword(value) case _ => builder } case _=> logger.warn(s"Couldn't interpret line $line") } } builder = builder.withDescriptiveLabel(file.getName) logger.info(s"Loaded ${builder.cluster} for ${builder.addresses} from ${file.getAbsolutePath}") Success(builder) } catch { case err:Throwable=>Failure(err) } finally { src.close() } } def fromFile(file: File) = builderFromFile(file).flatMap(_.getUserInfo) }