/*
 * 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.ode.bpel.compiler;

import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.compiler.api.CompilationException;
import org.apache.ode.bpel.compiler.api.CompilerContext;
import org.apache.ode.bpel.compiler.api.ExpressionValidator;
import org.apache.ode.bpel.compiler.bom.Process;
import org.apache.ode.bpel.compiler.bom.Expression;
import org.apache.ode.bpel.obj.OVarType;

public class ExpressionValidatorFactory {
    private static final Logger __log = LoggerFactory.getLogger(ExpressionValidatorFactory.class);
    private ExpressionValidator _validator = new EmptyValidator();

    public ExpressionValidatorFactory(Properties config) {
        String propertyName = "org.apache.ode.validator";
        String validatorClass = (String) config.getProperty(propertyName, "");
        __log.debug("Trying property " + propertyName + " got value: " + validatorClass);
        if (!validatorClass.equals("")) {
            try {
                _validator = (ExpressionValidator) getClass().forName(validatorClass).newInstance();
            } catch (Exception e) {
                __log.warn("Cannot instantiate expression validator of class " + validatorClass);
            }
        }
    }

    public ExpressionValidator getValidator() {
        return _validator;
    }

    private static class EmptyValidator implements ExpressionValidator {
        public void bpelImportsLoaded(Process source, CompilerContext compilerContext) throws CompilationException {}
        public void bpelCompilationCompleted(Process source) throws CompilationException {}
        public Object validate(Expression source, OVarType rootNodeType, Object requestedResultType) throws CompilationException { return null; }
    }
}
