jw3 commented on a change in pull request #431: URL: https://github.com/apache/incubator-daffodil/pull/431#discussion_r505108216
########## File path: daffodil-lib/src/main/scala/org/apache/daffodil/util/Validators.scala ########## @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.daffodil.util + +import java.util.ServiceLoader + +import org.apache.daffodil.api.CompiledValidator +import org.apache.daffodil.api.Validator +import org.apache.daffodil.api.Validator.CompilerOps.CheckArgs +import org.apache.daffodil.api.ValidatorNotFoundException + +import scala.collection.JavaConverters._ + +object Validators { + val default: Validator = new DefaultValidatorSPIProvider + def compiler(): ValidatorCompiler = new Compiler + + trait ValidatorCompiler { + def find(name: String): Option[CompiledValidator] + def isRegistered(name: String): Boolean + def compile(name: String, args: Validator.ArgumentList): CompiledValidator + } + + private class Compiler extends ValidatorCompiler { + private var compiled = Map.empty[String, CompiledValidator] + private lazy val impls: Map[String, Validator] = + ServiceLoader + .load(classOf[Validator]) + .iterator() + .asScala + .map(v => v.name() -> v) + .toMap + Review comment: > dp.withValidator(Validator.Custom("sch", "key1=value1 key2=value2")) Nah, it never would have ended up like that. I should have focused more on API before submitting PR, but here we are. Ultimately I want to get as close to type safety and convenience as we can. There was some work towards this in the commits earlier today. > val validator = configureAndCompileValidatorOfChoice() > dp.withValidation(validator) Yeah, I think we are heading in that direction now. Are you tracking @mbeckerle's compiled approach? > Note that this feels different to me than Daffodil's UserDefinedFunctions which also use SPI. But UDFs feel different because they literally are drop and go. There's no configuration that needs to be done or selection of which ones to use. You just drop in a UDF jar on the class path and if a schema uses a UDF by that name then we use it as is. Yeah, realizing I needed to handle arguments was a bit of a shock that came after thinking the implementation was simple :) and then the shock of needing multiple arguments followed that. Have an idea Ill post at the top level that just came to me when discussing this. Thanks ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected]
