/* * Copyright 2012 NGDATA nv * * Licensed 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.lilyproject.indexer.model.indexerconf; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.lilyproject.repository.api.QName; public abstract class AbstractNameTemplateValidator implements NameTemplateValidator { private Set<Class> supportedTypes = new HashSet<Class>(); private Set<String> variables = new HashSet<String>(); private Set<String> booleanVariables = new HashSet<String>(); private Set<String> variantProperties = new HashSet<String>(); private Set<QName> fieldNames = new HashSet<QName>(); protected AbstractNameTemplateValidator(Set<Class> supportedTypes, Set<String> variables, Set<String> booleanVariables, Set<String> variantProperties, Set<QName> fieldNames) { this.supportedTypes = supportedTypes; this.variables = variables; this.booleanVariables = booleanVariables; this.variantProperties = variantProperties; this.fieldNames = fieldNames; } @Override public void validate(NameTemplate template) throws NameTemplateException { for (TemplatePart part : template.getParts()) { if (!supportedTypes.contains(part.getClass())) { throw new NameTemplateException("Unsupported template part: " + part.getClass(), template.getTemplate()); } PartValidator validator = partValidators.get(part.getClass()); if (validator == null) { throw new NameTemplateException("Don't know how to validate " + part.getClass(), template.getTemplate()); } validator.validate(template.getTemplate(), part); } } private interface PartValidator { void validate(String template, TemplatePart part) throws NameTemplateException; } private Map<Class, PartValidator> partValidators = new HashMap<Class, PartValidator>(); { partValidators.put(LiteralTemplatePart.class, allOk()); partValidators.put(ConditionalTemplatePart.class, conditionalValidator()); partValidators.put(VariableTemplatePart.class, variableValidator()); partValidators.put(FieldTemplatePart.class, fieldValidator()); partValidators.put(VariantPropertyTemplatePart.class, variantPropertyValidator()); } private PartValidator allOk() { return new PartValidator() { @Override public void validate(String template, TemplatePart part) { // ok! } }; } private PartValidator conditionalValidator() { return new PartValidator() { @Override public void validate(String template, TemplatePart part) throws NameTemplateException { String condition = ((ConditionalTemplatePart) part).getConditional(); if (booleanVariables != null && !booleanVariables.contains(condition)) { throw new NameTemplateException("No such boolean variable: " + condition, template); } } }; } private PartValidator variableValidator() { return new PartValidator() { @Override public void validate(String template, TemplatePart part) throws NameTemplateException { String var = ((VariableTemplatePart) part).getVariable(); if (variables != null && !variables.contains(var)) { throw new NameTemplateException("No such variable: " + var, template); } } }; } private PartValidator fieldValidator() { return new PartValidator() { @Override public void validate(String template, TemplatePart part) throws NameTemplateException { QName field = ((FieldTemplatePart) part).getFieldName(); if (fieldNames != null && !fieldNames.contains(field)) { throw new NameTemplateException("No such field: " + field, template); } } }; } private PartValidator variantPropertyValidator() { return new PartValidator() { @Override public void validate(String template, TemplatePart part) throws NameTemplateException { String variantProperty = ((VariantPropertyTemplatePart) part).getName(); if (variantProperties != null && !variantProperties.contains(variantProperty)) { throw new NameTemplateException("No such variant property: " + variantProperty, template); } } }; } }