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]


Reply via email to